相同的数据对象每次都在django-sqlite3中创建吗?

问题描述

我正在研究一个Django项目,该项目会抓取一些数据并将其存储在SQLite数据库中:-
models.py文件

from django.db import models
from django.utils.text import slugify

class News(models.Model):
    title         =   models.CharField(max_length=120)
    datess        =   models.CharField(max_length=120)
    linkss        =   models.CharField(max_length=120)
    slug          =   models.SlugField(blank=True,null=True)

    def save(self,*args,**kwargs):
        if not self.slug and self.title:
            self.slug = slugify(self.title)
        super(News,self).save(*args,**kwargs)

    class Meta:
        verbose_name_plural = "news"

    def __str__(self):
        return f'{self.title}'

    def get_absolute_url(self):
        return f"/news/{self.slug}"

这是 views.py文件

from django.shortcuts import render
from .models import News
from django.core.paginator import Paginator
from django.db.models import Q
# For scraping part
import requests
from bs4 import BeautifulSoup


def news_list(request,**kwargs):
    # fOR scraping part - START::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    response = requests.get("http://www.iitg.ac.in/home/eventsall/events")
    soup = BeautifulSoup(response.content,"html.parser")
    cards = soup.find_all("div",attrs={"class": "newsarea"})

    iitg_title = []
    iitg_date = []
    iitg_link = []
    for card in cards[0:6]:
        iitg_date.append(card.find("div",attrs={"class": "ndate"}).text)
        iitg_title.append(card.find("div",attrs={"class": "ntitle"}).text.strip())
        iitg_link.append(card.find("div",attrs={"class": "ntitle"}).a['href'])
    # fOR scraping part - END::::::::::::::::::::::::::::::::::::::::::::::::::::::::

    # fOR storing the scraped data directly into the dtatbase from the views.py file - START---------------------------------------------------------------
    for i in range(len(iitg_title)):
        News.objects.create(title = iitg_title[i],datess = iitg_date[i],linkss = iitg_link[i])
    # fOR storing the scraped data directly into the dtatbase from the views.py file - END-----------------------------------------------------------------

    queryset = News.objects.all()   #Getting all the objects from the database

    search_query = request.GET.get('q')
    if search_query:
        queryset = queryset.filter(
            Q(title__icontains = search_query) |
            Q(description__icontains = search_query)
        )

    paginator = Paginator(queryset,5)  #Adding pagination
    page_number = request.GET.get('page')
    queryset = paginator.get_page(page_number)

    context = {
       'object_list': queryset
    }

    return render(request,'news_list.html',context)

每次刷新网页时,一次又一次地创建相同的对象,我尝试了一种方法来检查数据库中是否已经存在数据,但是我无法找出确切的condition做这些。

解决方法

如果用于创建对象的数据在每次迭代中都相同,则应使用此功能get_or_create而不是here中的create。它将使用在kwargs上传递的参数搜索数据库。如果不存在,django将为您创建一个新对象。在您的示例中,代码应如下所示:

for i in range(len(iitg_title)):
        News.objects.get_or_create(title = iitg_title[i],datess = iitg_date[i],linkss = iitg_link[i])

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...