【问题标题】:Django-import-export - import of advanced fields?Django-import-export - 高级字段的导入?
【发布时间】:2013-11-13 21:57:20
【问题描述】:

对于 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)

但怀疑这是正确的方法。

如果有任何提示如何处理自定义字段的导入,将不胜感激。

【问题讨论】:

    标签: python django django-models satchmo django-import-export


    【解决方案1】:

    您可以改写import_obj。详情请见Import workflow

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

    【讨论】:

    • 谢谢。当然,覆盖 Field 方法是一个好主意,但我只是感兴趣是否已经有某种方法可以导入以前使用 dehydrate_ 方法导出的自定义字段内容。不喜欢重新发明轮子..
    • 我问了类似的问题stackoverflow.com/questions/22655339/… 也许你可以帮助你的 django-import-export 经验?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2015-05-08
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2021-03-07
      相关资源
      最近更新 更多