Django Rest 框架序列化多对多字段

Django Rest framework Serialize many to many field

我正在尝试序列化一个 json 有效载荷,它有一个带有数组的字段,.is_valid() 检查返回 true 但我在尝试这样做时得到 KeyError: 'passengers' serializer.data['passengers'] 但其他字段工作正常(例如 booking_number 和状态)。

这是response.data我传递给序列化器的:

{'booking_number': 2839, 'passengers': [{'first_name': 'Jack', 'surname': 'Smith', 'email': 'smith@mail.com', 'phone_number': '1234'}], 'status': 'ON_HOLD'} 

我的序列化程序:

class PassengerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Passenger



class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(read_only=True, many=True)

    class Meta:
        model = Booking
        fields = ('booking_number', 'passengers', 'status')

我的模特:

class Passenger(models.Model):
    first_name = models.CharField(max_length=25)                                    
    surname = models.CharField(max_length=25)                                       
    email = models.EmailField()                                                     
    phone_number = models.CharField(max_length=12) 


class Booking(models.Model):
    booking_number = models.IntegerField(unique=True)                                                                                           
    passenger = models.ManyToManyField(Passenger)                                   
    status = models.CharField(max_length=10)                                        
    hold_time = models.DateTimeField()  

任何有关如何实现此功能的建议都将不胜感激。

顺便说一句,我在关注这个:

如果你需要反序列化字段,你不应该使用read_only=True:

class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(many=True)
    ...

请注意,这不足以保存 m2m 关系:如 Writable nested serializers 中所述,您还需要定义 create() and/or update() 方法在你的序列化器上:

class FindBus(serializers.ModelSerializer):
    passengers = PassengerSerializer(many=True)
    ...

    def create(self, validated_data):
        ...

    def update(self, validated_data):
        ...

需要 create/update 的原因是您必须决定您收到的乘客详细信息是指现有对象还是需要创建。

您可能还需要将 fields = ('__all__',)(或指定您感兴趣的字段)添加到您的 PassengerSerializer:

class PassengerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Passenger
        fields = ('__all__',)