首页 > 解决方案 > django save() 在 sqlite 中不起作用

问题描述

我有一个scrapy项目,想将检索到的数据保存在sqlite中。我在视图文件中写了scrapy spider。你可以在下面看到它的一部分。

这是views.py文件:

class DivarSpider(scrapy.Spider):
    name = "divar"


    def parse_first_page(self, response):
        .
        .
        yield scrapy.Request(url=url, method='GET', callback=self.parse_each_ads)


    def parse_each_ads(self, response):
        .
        .
        .
        src = Source()
        src.name = self.name
        ctlg = Catalogue()
        ctlg.city = city
        ctlg.price = price
        ctlg.datetime = date
        ctlg.source = self.name
        ctlg.source_token = token
        src.save()
        ctlg.save()

这是models.py文件:

class Source(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Catalogue(models.Model):
    source = models.ForeignKey(Source, null=False, on_delete=models.CASCADE)
    city = models.CharField(max_length=100)
    price = models.CharField(max_length=100)
    datetime = models.CharField(max_length=100)
    source_token = models.CharField(max_length=100)

为什么src.save()ctlg.save()不起作用?

标签: pythondjangoscrapy

解决方案


我有同样的问题,你必须引用一个模型,保存它,然后引用另一个。您的代码可以像这样更好:

    src = Source.objects.create(name=self.name)
    ctlg = Catalogue(city=city, price=price, datetime=date, source=self.name, 
                     source_token=token)

要在一个步骤中创建和保存对象,请使用该create()方法。 https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects

对于 Catalogue 的源属性,您应该传递模型引用,而不是模型名称:

..., source = src, ...

推荐阅读