如何根据外键对象序列化objects.filter django的结果

Spi*_*der 2 python django django-rest-framework

我有两个模型,一个模型具有另一个模型的外键:

class Booking(models.Model):

type_course_requested = models.ManyToManyField(TypePost, blank=True)
    .....
    #Presentation Message

    message = models.CharField(max_length=1000)

class BookingDemand(models.Model):

    booking = models.ForeignKey(Booking, on_delete=models.CASCADE, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

我想根据特定条件获取预订需求,然后序列化为类似以下代码的内容:

{ 'booking1': { 'key1':...
               'bookingDemands': {....}
             }, 
  'booking2': {...}
}
Run Code Online (Sandbox Code Playgroud)

过滤是这样完成的:

bookings=BookingDemand.objects.filter(booking__post__person=self.request.user)
Run Code Online (Sandbox Code Playgroud)

它返回一个查询集,但我找不到如何序列化它们以分别进行每个预订,如上所述。

JPG*_*JPG 6

创建一个序列化器并设置depth=1如下

from rest_framework import serializers


class BookingDemandSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookingDemand
        fields = '__all__'
        depth = 1
Run Code Online (Sandbox Code Playgroud)

然后将您的查询集序列化为

bookings = BookingDemand.objects.filter(booking__post__person=self.request.user)
booking_serializer = BookingDemandSerializer(bookings, many=True)
booking_serializer.data  # here is the serialized data
Run Code Online (Sandbox Code Playgroud)

更新

# serializer.py
from rest_framework import serializers


class BookingDemandSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookingDemand
        fields = '__all__'


class BookingSerializer(serializers.ModelSerializer):
    booking_demands = BookingDemandSerializer(source='bookingdemand_set', many=True)

    class Meta:
        model = Booking
        fields = '__all__'


# serialization process
queryset = Booking.objects.all()  # apply filter if you want
serializer = BookingSerializer(queryset, many=True)
serializer.data # here is the data
Run Code Online (Sandbox Code Playgroud)