【问题标题】:Django import-export fieldsDjango 导入导出字段
【发布时间】:2015-11-09 12:18:14
【问题描述】:

我有一个关于 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 方法,以便将选择转换为名称。但是这里不可能使用方法,只允许使用字段。任何提示如何做到这一点?

【问题讨论】:

  • 好的,我知道如何解决它 - 只需在渲染方法中构建一个具有正确格式的新 django-import-export 小部件 :)
  • 我也有同样的问题,你能写代码吗,你是怎么解决这个问题的?用“def脱水”?
  • 这是我的问题link,你能帮忙吗,@hebius ?

标签: python django django-import-export


【解决方案1】:

您可以在 Django Admin 中使用 'get_FOO_display' 来实现:

class MyModelResource(resources.ModelResource):
    status = fields.Field(
        attribute='get_status_display',
        column_name=_(u'Status')
    )

【讨论】:

    【解决方案2】:

    如果你想导入和导出在 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
    

    【讨论】:

    • 你救了我的命,谢谢
    【解决方案3】:

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

    class MyModelResource(resources.ModelResource):
        status_name = fields.Field()
    
        def dehydrate_status_name(self, myModel):
            MyModel.get_status_name_by_status(myModel.status)
    

    【讨论】:

      【解决方案4】:

      一种快速实现这一点的hack方法,只需将_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
              )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2015-05-28
        • 1970-01-01
        • 2023-03-08
        • 2022-07-25
        • 1970-01-01
        • 2015-05-08
        相关资源
        最近更新 更多