made DjangoItem a descendant of Item and its metaclass

This commit is contained in:
Ismael Carnales 2009-08-26 11:38:49 -03:00
parent fb39bca24f
commit 8efe6eb55e
2 changed files with 7 additions and 10 deletions

View File

@ -1,7 +1,7 @@
from scrapy.item import DictItem, Field
from scrapy.item import Field, Item, ItemMeta
class DjangoItemMeta(type):
class DjangoItemMeta(ItemMeta):
def __new__(mcs, class_name, bases, attrs):
cls = super(DjangoItemMeta, mcs).__new__(mcs, class_name, bases, attrs)
@ -12,17 +12,14 @@ class DjangoItemMeta(type):
cls._model_meta = cls.django_model._meta
for model_field in cls._model_meta.fields:
# XXX: for now we're treating each PK as autogenerated field
if model_field != cls._model_meta.pk:
if model_field != cls._model_meta.pk and \
model_field.name not in cls.fields:
cls.fields[model_field.name] = Field()
cls._model_fields.append(model_field.name)
# add declared fields
for n, v in attrs.iteritems():
if isinstance(v, Field):
cls.fields[n] = v
return cls
class DjangoItem(DictItem):
class DjangoItem(Item):
__metaclass__ = DjangoItemMeta

View File

@ -17,7 +17,7 @@ class Field(dict):
"""Container of field metadata"""
class _ItemMeta(type):
class ItemMeta(type):
def __new__(mcs, class_name, bases, attrs):
fields = {}
@ -81,7 +81,7 @@ class DictItem(DictMixin, BaseItem):
class Item(DictItem):
__metaclass__ = _ItemMeta
__metaclass__ = ItemMeta
class ScrapedItem(BaseItem):