我有一个关于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方法,因此选项将转换为名称。但是这里不可能使用方法,只允许字段。任何提示如何做到这一点?
答案 0 :(得分:3)
您可以使用'get_FOO_display'在Django Admin中实现此目的:
class MyModelResource(resources.ModelResource):
status = fields.Field(
attribute='get_status_display',
column_name=_(u'Status')
)
答案 1 :(得分: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
)
答案 2 :(得分:0)
如果您希望导入和导出在Django import-export中具有不同的字段。
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
答案 3 :(得分:0)
并非所有数据都可以轻松地从对象/模型属性中提取。为了将复杂的数据模型转换为(通常更简单)的处理数据结构,应定义dehydrate_fieldname方法:
class MyModelResource(resources.ModelResource):
status_name = fields.Field()
def dehydrate_status_name(self, myModel):
MyModel.get_status_name_by_status(myModel.status)