Django ImportExport 动态字段
Django ImportExport dynamic fields
我正在使用 Django ImportExport。
我想从名为 Room
的模型中导出所有条目。每个 Room
可以包含一到 m(20 的上限)Table
个。
所以我有以下资源:
class RoomResource(resources.ModelResource):
table1 = Field()
table2 = Field()
# ...
tableM = Field()
class Meta:
model = Room
fields = ('table1', 'table2', 'tableM')
@staticmethod
def _dehydrate_table(room, table_number):
if not room.table_number.count() > number - 1:
return ''
return getattr(room.table_number.all()[number - 1], 'person_count', '')
def dehydrate_table1(self, room):
return self._dehydrate_table(room, 1)
def dehydrate_table2(self, instance):
return self._dehydrate_table(room, 2)
def dehydrate_tableM(self, instance):
return self._dehydrate_table(room, M)
这很好用(因为我的 M 的上限为 20)但似乎没有像应该的那样动态求解。
所以我认为我需要做三件事:
1.) 动态设置字段 = (...)
2.) 动态设置 class 属性 tableM = Field()
3.) 动态设置 dehydrate_tableM()。
我尝试通过 __init__
方法执行此操作,但这会将字段添加到实例字典而不是 class 字典,这不起作用。
那我该如何解决呢?
通过覆盖 def get_fields(self, **kwargs)
解决了它。
在那里你必须找到关系最多的条目并为每个关系添加一个字段:
max_table_count = max([qs.tables.count() for qs in self.get_queryset()])
for current in range(1, max_table_count + 1):
new_field = Field(column_name=f'Table {current}')
self.fields[f'table_{current}'] = new_field
我正在使用 Django ImportExport。
我想从名为 Room
的模型中导出所有条目。每个 Room
可以包含一到 m(20 的上限)Table
个。
所以我有以下资源:
class RoomResource(resources.ModelResource):
table1 = Field()
table2 = Field()
# ...
tableM = Field()
class Meta:
model = Room
fields = ('table1', 'table2', 'tableM')
@staticmethod
def _dehydrate_table(room, table_number):
if not room.table_number.count() > number - 1:
return ''
return getattr(room.table_number.all()[number - 1], 'person_count', '')
def dehydrate_table1(self, room):
return self._dehydrate_table(room, 1)
def dehydrate_table2(self, instance):
return self._dehydrate_table(room, 2)
def dehydrate_tableM(self, instance):
return self._dehydrate_table(room, M)
这很好用(因为我的 M 的上限为 20)但似乎没有像应该的那样动态求解。
所以我认为我需要做三件事:
1.) 动态设置字段 = (...)
2.) 动态设置 class 属性 tableM = Field()
3.) 动态设置 dehydrate_tableM()。
我尝试通过 __init__
方法执行此操作,但这会将字段添加到实例字典而不是 class 字典,这不起作用。
那我该如何解决呢?
通过覆盖 def get_fields(self, **kwargs)
解决了它。
在那里你必须找到关系最多的条目并为每个关系添加一个字段:
max_table_count = max([qs.tables.count() for qs in self.get_queryset()])
for current in range(1, max_table_count + 1):
new_field = Field(column_name=f'Table {current}')
self.fields[f'table_{current}'] = new_field