2

Room モデルとの単純な ForeignKey 関係を持つ Booking モデルを使用した部屋予約アプリケーションがあります。これが私が扱っているものの超簡単なアイデアです:

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

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

予約モデルで django-import-export を使用して、管理者が Excel にインポートできる方法でこのデータのバックアップを作成できるようにしました。私の時間を犠牲にすることなく、必要に応じてデータを迅速に提供できるので、非常に便利です。

私の問題は、部屋の関係が無視されることです。room_id関係に従うのではなく、それを汲み上げます。データをインポートするためにこれがどのように理にかなっているかは理解していますが、すべての実用的な外部目的では、ルームprimary_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 に答える