12

对于 Django 模型,我使用django-import-export包。

如果需要导出更多可用的模型字段,例如属性或自定义字段,可以使用import_export.fields.Field类和可选dehydrate_<field>方法添加新的。

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)

但怀疑这是正确的方法。

希望有任何提示如何处理自定义字段的导入。

4

2 回答 2

5

import_obj您可以改为覆盖。有关更多详细信息,请参阅导入工作流程

另一种方法是继承Field并覆盖exportsave方法,并在字段中执行所有必需的数据操作。

于 2013-11-06T12:33:25.487 回答
1

我知道这已经很老了,但我遇到了同样的问题,这就是我修复它的方法(基于原始提问者的方向)。首先,您可以通过覆盖“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

希望这对任何人都有帮助!

于 2020-03-31T22:51:44.147 回答