我的房间预订应用程序的预订模式与我的房间模型有简单的ForeignKey关系。这是对我所处理的内容的超级简要概念:
class Room(..):
floor = models.IntegerField()
number = models.IntegerField()
...
class Booking(..):
room = models.ForeignKey('Room')
...
我一直在Booking模型上使用django-import-export让管理员以他们可以导入Excel的方式备份这些数据。对于快速按需提供数据而不花费我的时间,这非常有用。
我的问题是房间关系被忽略了;它抽出room_id
而不是跟随关系。我理解为了导入数据这有什么意义,但出于所有实际的外部目的,Room primary_key
完全没用。查看预订数据的人需要知道它所在的楼层和号码。
是否有一种简单的方法可以将额外的数据添加到django-import-export的数据中,从根本上对这些字段进行非规范化处理?
答案 0 :(得分:3)
请参阅文档中的Getting started。
定义ModelResource字段时,可以遵循模型关系:
class BookResource(resources.ModelResource):
class Meta:
model = Book
fields = ('author__name',)
在您的情况下,字段为('room__floor', 'room__number',)
答案 1 :(得分:0)
实际上并不那么痛苦!我们需要覆盖ModelAdmin上的几个ImportExportModelAdmin
函数,将额外的数据添加到查询中,然后将其拉过来。
class BookingAdmin(ImportExportModelAdmin):
...
def get_resource_class(self):
from import_export.fields import Field
rc = super(BookingAdmin, self).get_resource_class()
for f in ('room_floor', 'room_number'):
rc.fields[f] = Field(f, f, readonly=True)
return rc
def get_export_queryset(self, request):
rs = super(BookingAdmin, self).get_export_queryset(request)
return rs.annotate(
room_floor=F('room__floor'),
room_number=F('room__number')
)
不知道导入时会发生什么。我已经将字段设置为只读,因此应该被忽略。值得庆幸的是,我们已经过了重要的事情。