我想用django使用scrapy,但我不知道如何处理django foreignkey
我的数据库是postgreSQL
请指导我。谢谢。
models.py:
class ShoppingApple(models.Model):
link = models.URLField(max_length=255)
title = models.CharField(max_length=100)
class ImageApple(models.Model):
article = models.ForeignKey(ShoppingApple)
image =models.CharField(max_length=255)
pipelines.py:
class ShopPipeline(object):
if isinstance(item, Shop_appleItem):
shopping = item.save(commit=False)
shopping.save()
return item
if isinstance(item, Shop_apple_imgItem):
shopping = item.save(commit=False)
shopping.save()
return item
像这样的蜘蛛:
def parse(self,response):
item = Shopping_appleItem()
product = Shopping_apple_imgItem()
sel = Selector(response)
item['link'] = sel.css(" ").extract()
item['title'] = sel.css(" ").extract()
product['image'] = sel.css(" ").extract()
yield item
yield product
当我运行我的scrapy时,错误是:
django.db.utils.IntegrityError: null value in column "article_id" violates not-null constraint
DETAIL: Failing row contains (1, null, http://test...).
答案 0 :(得分:0)
您是否检查过某处是否有空值? 尝试将默认设置为null仅用于测试。
ALTER TABLE article SET DEFAULT NULL
然后再次运行以查看是否收到相同的错误。
答案 1 :(得分:0)
您使用South或任何其他工具进行迁移(或Django 1.7+)吗?如果是这样,只需将模型更新为:
class ImageApple(models.Model):
article = models.ForeignKey(ShoppingApple)
image =models.CharField(max_length=255, null=True)
生成并运行迁移,这应该可以解决问题。
答案 2 :(得分:0)
我所做的是使用常规的scrapy项目(不是django项目,那个东西非常有限),只需手动创建对象并添加我需要的东西。
class MyItem(scrapy.Item):
name = scrapy.Field()
image_url = scrapy.Field()
手动处理下载并自行创建对象:
object = Object.objects.create(foo="something")
object.save()
self.image_url = item['image_url']
self.get_remote_image(object)
您可以使用urllib轻松获取图片:
def get_remote_image(self,object):
if self.image_url:
myopener = MyOpener()
page = myopener.retrieve(self.image_url)
response = page[0]
image = open(response)
extension = os.path.splitext(image.name)[1]
picture = Picture(object=object)
picture.save()
picture.picture.save('new' + extension, File(image))
我尝试用django项目做到这一点,但厌倦了尝试并找到了这种方式。实现起来并不难,并且可以更自由地创建对象。
不要忘记将django.setup()
添加到您的scrapper的settings.py。