对于Django模型,我正在使用django-import-export包。
如果需要导出更多,只有可用的模型字段,例如属性或自定义字段,可以使用import_export.fields.Field
类和可选的dehydrate_<field>
方法添加new。
from import_export import resources, fields, instance_loaders
class ProductResource(resources.ModelResource):
categories = fields.Field()
price = fields.Field(attribute='unit_price')
class Meta:
model = Product
def dehydrate_categories(self, product):
return ';'.join(
'/%s' % '/'.join([c.name for c in cat.parents()] + [cat.name])
for cat in product.category.iterator() )
它确实运行良好,但仅适用于导出。那么进口,反向过程呢?是否有dehydrate_
方法的对应部分?
到目前为止,我已经覆盖了get_or_init_instance
方法:
class ProductResource(resources.ModelResource):
def get_or_init_instance(self, instance_loader, row):
row['unit_price'] = row['price']; row.pop('price')
return super(ProductResource, self).get_or_init_instance(instance_loader, row)
但怀疑这是正确的方法。
非常感谢任何提示如何处理自定义字段的导入。
答案 0 :(得分:3)
您可以改为覆盖import_obj
。有关详细信息,请参阅Import workflow。
另一种方法是继承Field并覆盖export
和save
方法,并在字段中执行所有必需的数据操作。
答案 1 :(得分:0)
我知道这已经很老了,但是我遇到了同样的问题,这就是我解决问题的方式(基于原始提问者的前进方向)。 首先,您可以通过覆盖'before_import_row'函数来添加所需的任何自定义/修改后的字段,如下所示:
def before_import_row(self, row, **kwargs):
row['extra_info'] = 'Some Info'
return super(RetailLocationResource, self).before_import_row(row, **kwargs)
然后您可以通过覆盖get_or_init_instance来将其传递到实例中,如下所示:
def get_or_init_instance(self, instance_loader, row):
instance, bool = super(RetailLocationResource, self).get_or_init_instance(instance_loader, row)
instance.extra_info = row['extra_info']
return instance, bool
希望这对任何人都有帮助!