用django scrapy:如何使用外键

时间:2014-10-06 07:39:55

标签: python django scrapy

我想用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...).

3 个答案:

答案 0 :(得分:0)

您是否检查过某处是否有空值? 尝试将默认设置为null仅用于测试。

ALTER TABLE article SET DEFAULT NULL

PostgreSQL ALTER TABLE

然后再次运行以查看是否收到相同的错误。

答案 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。