首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy / Django -与DjangoItem的对外密钥关系

Scrapy / Django -与DjangoItem的对外密钥关系
EN

Stack Overflow用户
提问于 2015-02-21 20:30:08
回答 1查看 752关注 0票数 2

下面是我在这只蜘蛛身上发现的东西:

代码语言:javascript
复制
phone_model = SmartphoneItem()
phone_model['sku_number'] = sku_number

# code omitted

cellular_network = CellularNetworkItem()
cellular_network['phone_model'] = phone_model
cellular_network['speed'] = speed
...

在models.py中:

代码语言:javascript
复制
class CellularNetwork(models.Model): 
    phone_model = models.ForeignKey('Smartphone', unique=True)
    ...

class Smartphone(models.Model):
    sku_number = models.IntegerField(max_length=40, primary_key=True)
    ....

在items.py中:

代码语言:javascript
复制
class CellularNetworkItem(DjangoItem):
    django_model = CellularNetwork

class SmartphoneItem(DjangoItem):
    django_model = Smartphone

但是,分配phone_model = SmartphoneItem()显然不会产生智能手机模型。

我正在刮一堆规范,并希望在源验证数据。由于数据必须标准化以进行验证,所以我更愿意用一块石头杀死太多的鸟,然后立即更新数据库。

从表面上看,ORMs相对于简单的Scrapy项目的关系能力才是销售DjangoItem的原因。但是我似乎找不到在蜘蛛中直接利用这个特性的任何例子。我似乎使用了管道,用isinstance模式匹配逐个处理对象.我开始怀疑直接将Django模型导入到蜘蛛中是否会更好。

更新:已解决。

基于How to update DjangoItem in Scrapy,我将其放入蜘蛛中以直接返回Django模型实例:

代码语言:javascript
复制
def item_to_model(self, item):
    model_class = getattr(item, 'django_model')
    if not model_class:
        raise TypeError("Item is not a `DjangoItem` or is misconfigured")

    return item.instance

更新2:仍然损坏:

说得太早了。虽然这提供了一个有效的Django实例,但它不是实例。以下是djangoitem.py的相关部分:

代码语言:javascript
复制
@property
def instance(self):
    if self._instance is None:
        modelargs = dict((k, self.get(k)) for k in self._values
                          if k in self._model_fields)
        self._instance = self.django_model(**modelargs)
    return self._instance

我不完全明白这是怎么回事,但我想它给了我们一个新的例子。

EN

回答 1

Stack Overflow用户

发布于 2017-08-17 21:37:56

问题看起来很老,但无论如何。首先,您缺少了一个将“传递”项“传递”给Django的管道。Second,对于FK,您需要Django对象(适当的模型)的实例,而不是Scrapy item的实例。因此,您的代码应该看起来有点像这样:

代码语言:javascript
复制
class SmartphonePipeline(object):

    def process_item(self, item, spider):
        sku_number = item['sku_number']
        smartphone, created = Smartphone.objects.get_or_create(sku_number=item['sku_number'])
        if created:
            smartphone.save()

class CellularNetworkPipeline(object):

    def process_item(self, item, spider):
        smartphone_item = item['phone_model']
        smartphone = Smartphone.objects.get(sku_number=smartphone_item["sku_number"])
        cellular_network, created = CellularNetwork.objects.get_or_create(phone_model=smartphone)
        cellular_network.speed = item['speed']
        cellular_network.save()
        return item
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28650955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档