Python django save()不';sqlite中的t效应
我有一个粗略的项目,希望将检索到的数据保存在sqlite中。我在视图文件中编写scrapy spider。你可以在下面看到它的一部分 这是Python django save()不';sqlite中的t效应,python,django,scrapy,Python,Django,Scrapy,我有一个粗略的项目,希望将检索到的数据保存在sqlite中。我在视图文件中编写scrapy spider。你可以在下面看到它的一部分 这是views.py文件: class DivarSpider(scrapy.Spider): name = "divar" def parse_first_page(self, response): . . yield scrapy.Request(url=url, meth
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()
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)
这是models.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()
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()
不起作用?要创建实例并保存它,可以使用以下代码段:
src = Source(name=self.name)
src.save()
目录模式也是如此。对于外键,您需要在源字段中传递src的实例,这将起作用。参考我也有同样的问题,你必须参考一个模型,保存它,然后再参考另一个。 您的代码可以更好地如下所示:
src = Source.objects.create(name=self.name)
ctlg = Catalogue(city=city, price=price, datetime=date, source=self.name,
source_token=token)
要在单个步骤中创建和保存对象,请使用create()
方法。
对于目录的源属性,应传递模型参考,而不是模型名称:
..., source = src, ...
你确定每个广告都被称为
parse\u吗?@klauds。是的,我肯定我很肯定不是,因为这会导致一些数据库约束错误。@klauds。我相信是的。。。由于终端中的日志,您设置的ctlg.source=self.name
不知道如何工作ctlg.source
应该是源代码的外键。您需要先保存源代码,然后保存ctlg.source=src
,然后再保存ctlg
。它不工作。它是否显示任何错误?您是否可以尝试仅保存源实例以检查实际问题?是的,我尝试仅保存源实例,但仍然不起作用。。。。有两个错误,但与此问题无关错误1:builtins.TypeError:\u findCaller()接受1到2个位置参数,但给出了3个位置参数
error 2:handler=\u signal.signal(\u enum\u to_int(signalnum),\u enum\u to_int(handler))builtins.ValueError:signal仅在主线程中工作