1

我有一个关于 django-import-export 的简短问题。在我的模型中,我有选择列表:

STATE_CHOICES = ((NEW_STATE, u'New'),
                 (DELIVERED_STATE, u'Delivered'),          
                 (LOST_STATE, u'Lost'),

以及处理名称映射选择的方法

@staticmethod
def get_status_name_by_status(status):
    return next((s[1] for s in MyModel.STATE_CHOICES if s[0] == status), 'Uknown')

我想导入/导出一些数据

class MyModelResource(resources.ModelResource):
    status = fields.Field(column_name='status', attribute='order',
                          widget=ForeignKeyWidget(Order, 'status'))

我想使用我的 get_status_name_by_status 方法,以便将选择转换为名称。但是这里不可能使用方法,只允许使用字段。任何提示如何做到这一点?

4

4 回答 4

6

您可以使用 'get_FOO_display' 在 Django Admin 中实现此目的:

class MyModelResource(resources.ModelResource):
    status = fields.Field(
        attribute='get_status_display',
        column_name=_(u'Status')
    )
于 2017-03-09T15:44:44.447 回答
1

并非所有数据都可以轻松地从对象/模型属性中提取。为了将复杂的数据模型转换为(通常更简单的)处理过的数据结构,应该定义 dehydrate_fieldname 方法:

class MyModelResource(resources.ModelResource):
    status_name = fields.Field()

    def dehydrate_status_name(self, myModel):
        MyModel.get_status_name_by_status(myModel.status)
于 2018-12-08T11:46:52.087 回答
1

如果您希望导入和导出在 Django 导入导出中具有不同的字段。

class CommonResourcesClass(resources.ModelResource):
    class Meta:
        model = Model
        fields = None

class ExportResourcesClass(resources.ModelResource):
    class Meta:
        model = Model
        fields = None

class ModelAdmin(ImportExportModelAdmin, ImportExportActionModelAdmin):
    list_display = ()
    resource_class = CommonResourcesClass
    def get_export_resource_class(self):
        return ExportResourcesClass
于 2018-11-28T09:51:49.367 回答
0

一种快速实现这一点的黑客方法,只需配置_choice_fields到您的选择字段,就是这样。

import import_export
from import_export import resources


class MyModelResource(resources.ModelResource):
    _choice_fields = [
        'field_a', 'field_b',
    ]
    for _field_name in _choice_fields:
        locals()[_field_name] = import_export.fields.Field(
            attribute='get_%s_display' % _field_name,
            column_name=MyModel._meta.get_field(_field_name).verbose_name
        )
于 2018-03-09T03:45:01.700 回答