与django-import-export的非规范化关系

时间:2015-10-01 07:20:36

标签: django django-import-export

我的房间预订应用程序的预订模式与我的房间模型有简单的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的数据中,从根本上对这些字段进行非规范化处理?

2 个答案:

答案 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')
        )

不知道导入时会发生什么。我已经将字段设置为只读,因此应该被忽略。值得庆幸的是,我们已经过了重要的事情。