【问题标题】:Filter related objects Django过滤相关对象 Django
【发布时间】:2019-02-14 18:29:12
【问题描述】:

想象一下 Django 中的此类模型:

class Organisation(Model):
    ...

class Guest(Model):
    organisation = ForeignKey(Guest, CASCADE, 'guests')

class Booking(Model):
    guest = ForeignKey(Guest, CASCADE, 'bookings')
    start_date = DateField()
    end_date = DateField()

使用 Django Rest Framework 需要执行一个端点

  • 要列出的所有组织
  • 要列出的所有客人
  • 要再次过滤 start_date 并列出的预订

响应示例:

"Organizations": [
    {
        ...,
        "Guests": [
            {
                ...,
                "Bookings": [
                     {...},
                     {...}
                ]
            },
            {
                ...,
                "Bookings": [
                ]
            }
        ]
    },
    {
        ...,
        "Guests": [
            {
                ...,
                "Bookings": [
                     {...},
                ]
            },
        ]
    }
]

因此,如您所见,我需要所有组织和客人都在场,而不仅仅是那些有预订的人。

执行此操作的最佳方法是什么?

更新:

使用的序列化器:

class BookingShortSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = (
            'pk',
            'start_date',
            'guest',
        )


class GuestBookingsSerializer(serializers.ModelSerializer):
    bookings = BookingShortSerializer(many=True)

    class Meta:
        model = Guest
        fields = (
            'pk',
            'name',
            'bookings',
        )


class OrganizationShortSerializer(serializers.ModelSerializer):
    guests = GuestBookingsSerializer(many=True)

    class Meta:
        model = Organization
        fields = (
            'pk',

            'public_name',
            'internal_name',

            'guests',

            'order',
        )

使用的视图集(现在没有过滤):

class OrganizationBookingsViewSet(mixins.ListModelMixin, GenericViewSet):
    ordering = 'order'

    serializer_class = OrganizationShortSerializer

    permission_classes = (AllowAny,)

    def get_queryset(self) -> QuerySet:
        return Organization.objects.all()

【问题讨论】:

  • 可以添加序列化器和视图类吗?
  • 添加了序列化程序和视图集
  • 如果你不过滤Organization QuerySet,你会得到预期的结果
  • 我不需要过滤Organization,而是过滤嵌套在其中的Booking

标签: django django-models django-rest-framework django-filter


【解决方案1】:

看起来这种使用 SerializerMethodField 的方法解决了这个任务。它应该被认为是一个好的解决方案吗?

class GuestBookingsSerializer(serializers.ModelSerializer):
    bookings = serializers.SerializerMethodField()

    class Meta:
        model = Guest
        fields = (
            'pk',
            'name',
            'bookings',
        )

    def get_bookings(self, guest):
        date = self.context.['request'].query_params['start_date__gte']
        bookings = guest.bookings.filter(start_date__gte=date).all()
        serializer = BookingShortSerializer(bookings, many=True)
        return serializer.data

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2018-11-18
    • 1970-01-01
    • 2012-11-29
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多