2

我有一个预订模型的房间预订应用程序,该模型与我的房间模型具有简单的 ForeignKey 关系。这是我正在处理的内容的一个超级简短的想法:

class Room(..):
    floor = models.IntegerField()
    number = models.IntegerField()
    ...

class Booking(..):
    room = models.ForeignKey('Room')
    ...

我一直在 Booking 模型上使用 django-import-export 让管理员以可以导入 Excel 的方式备份这些数据。它对于快速为他们提供按需数据而无需花费我的时间非常有用。

我的问题是房间关系被忽略了;它抽出room_id而不是遵循关系。我理解这对于导入数据有什么意义,但对于所有实际的外部目的,Room'sprimary_key完全没用。查看预订数据的人需要知道它的楼层和房间号。

有没有一种简单的方法可以将额外的数据添加到 django-import-export 的数据中,从而从本质上对这些字段进行非规范化?

4

2 回答 2

3

请参阅文档中的入门

在定义 ModelResource 字段时,可以遵循模型关系:

class BookResource(resources.ModelResource):

    class Meta:
        model = Book
        fields = ('author__name',)

在您的情况下,字段将是('room__floor', 'room__number',)

于 2015-10-01T13:25:57.727 回答
0

其实没那么痛!我们需要覆盖ImportExportModelAdminModelAdmin 上的几个函数,以将额外数据添加到查询中,然后将其拉出。

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

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

于 2015-10-01T07:51:02.787 回答