You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

满足数据库条件时如何从列表写入Django数据库?

Hey there! No worries at all—we all start somewhere with Django. Let's break down how to turn that scraper output into a working link aggregation site, step by step.

第一步:先定义Django模型(用来存储抓取的内容)

首先在你的news应用下的models.py里创建一个模型,用来存放从XML抓取到的文章信息:

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=255, verbose_name="文章标题")
    date = models.DateTimeField(verbose_name="发布日期")
    link = models.URLField(unique=True, verbose_name="原文链接")
    # 可以根据需求添加其他字段,比如来源站点描述等

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['-date']  # 默认按发布日期倒序排列

写完后记得运行数据库迁移命令:

python manage.py makemigrations
python manage.py migrate
第二步:改造你的scraper脚本,让它能把数据存入数据库

修改news/scraper.py,新增一个函数来处理数据入库逻辑,避免直接在MakeLists里耦合太多业务:

# 导入模型和日期处理工具
from .models import Article
from django.utils import timezone

def MakeLists():
    # 你的现有代码逻辑,生成Article_date, Article_link, Article_title等列表
    # 假设最终返回的是日期、链接、标题三个列表(长度一致)
    return Article_date, Article_link, Article_title

def save_articles_to_db():
    # 调用MakeLists获取数据
    dates, links, titles = MakeLists()
    
    # 循环遍历数据,存入数据库
    for date, link, title in zip(dates, links, titles):
        # 用get_or_create避免重复存储相同链接的文章
        article, created = Article.objects.get_or_create(
            link=link,
            defaults={
                'title': title,
                # 如果你的date是字符串格式,需要转成datetime对象,比如:
                # 'date': timezone.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
                'date': date
            }
        )
        if created:
            print(f"✅ 新增文章:{title}")
        else:
            print(f"ℹ️ 文章已存在:{title}")
第三步:调用抓取脚本的几种方式

方式1:手动在Django Shell里调用

打开终端进入项目根目录,运行:

python manage.py shell

然后在Shell里执行:

from news.scraper import save_articles_to_db
save_articles_to_db()

方式2:创建自定义Django管理命令(推荐)

在news应用下创建management/commands文件夹(需要新建__init__.py空文件),然后新建scrape_articles.py:

from django.core.management.base import BaseCommand
from news.scraper import save_articles_to_db

class Command(BaseCommand):
    help = "从XML抓取文章并保存到数据库"

    def handle(self, *args, **options):
        self.stdout.write("🔍 开始抓取文章...")
        save_articles_to_db()
        self.stdout.write(self.style.SUCCESS("✅ 抓取完成!"))

之后就可以直接在终端运行:

python manage.py scrape_articles

方式3:定时自动抓取(可选)

如果需要定期自动抓取,可以用django-crontab实现定时任务:

  1. 安装依赖:pip install django-crontab
  2. 在settings.py的INSTALLED_APPS里添加django_crontab
  3. 添加定时配置:
CRONJOBS = [
    # 每天早上9点自动抓取一次
    ('0 9 * * *', 'django.core.management.call_command', ['scrape_articles']),
]
  1. 启动定时任务:python manage.py crontab add
第四步:在页面展示聚合的链接

编写视图函数

在news/views.py里添加:

from django.shortcuts import render
from .models import Article

def article_list(request):
    # 获取所有文章,按日期倒序
    articles = Article.objects.all()
    return render(request, 'news/article_list.html', {'articles': articles})

创建模板文件

在news/templates/news下新建article_list.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>链接聚合站</title>
    <style>
        .article-item {
            margin: 15px 0;
            padding-bottom: 10px;
            border-bottom: 1px solid #eee;
        }
        .article-title {
            font-size: 1.2em;
            color: #2c3e50;
            text-decoration: none;
        }
        .article-date {
            color: #7f8c8d;
            font-size: 0.9em;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>最新聚合链接</h1>
        {% if articles %}
            {% for article in articles %}
                <div class="article-item">
                    <a href="{{ article.link }}" target="_blank" class="article-title">{{ article.title }}</a>
                    <p class="article-date">发布于:{{ article.date|date:"Y年m月d日 H:i" }}</p>
                </div>
            {% endfor %}
        {% else %}
            <p>暂无聚合内容,先运行抓取脚本试试吧!</p>
        {% endif %}
    </div>
</body>
</html>

配置URL路由

在项目根目录的urls.py里添加:

from django.contrib import admin
from django.urls import path
from news.views import article_list

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', article_list, name='article-list'),  # 首页展示聚合链接
]

现在启动Django服务python manage.py runserver,访问首页就能看到你的聚合链接啦!

内容的提问来源于stack exchange,提问作者user1563247

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:21:56