【问题标题】:Django Rest framework Serialize many to many fieldDjango Rest框架序列化多对多字段
【发布时间】:2018-10-14 06:45:53
【问题描述】:

我正在尝试序列化具有数组字段的 json 有效负载,.is_valid() 检查返回 true,但是当我尝试执行此操作时得到KeyError: 'passengers' serializer.data['passengers'] 但其他字段工作正常(例如 booking_number 和 status)。

这是我传递给序列化程序的 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()  

任何有关如何使这项工作的建议将不胜感激。

顺便说一句,我在关注这个:Django rest framework serializing many to many field

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

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

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

    请注意,这不足以保存 m2m 关系:如 Writable nested serializers 中所述,您还需要在序列化程序上定义 create() 和/或 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__',)
    

    【讨论】:

    • 添加 fields = ('all') 并删除只读就可以了。感谢您提供更多信息。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多