Django Rest Framework序列化多对多字段报错:KeyError: 'passengers'
嘿,我碰到过好几次这种糟心的情况!明明校验通过了,结果取字段的时候突然报KeyError,太让人头疼了。咱们一步步排查,常见的原因大概有这几个:
1.
passengers字段被设置为write_only=True 这是最容易踩的坑!如果你的序列化器里这么定义:
class BookingSerializer(serializers.ModelSerializer): passengers = PassengerSerializer(many=True, write_only=True) class Meta: model = Booking fields = ['booking_number', 'passengers', 'status']
write_only=True意味着这个字段只负责接收输入数据,不会被包含在serializer.data的输出里。解决办法很简单:去掉write_only=True就行(默认就是支持读写的):
passengers = PassengerSerializer(many=True)
2. 嵌套序列化器的配置问题
如果passengers用了自定义嵌套序列化器,得检查两个点:
- 嵌套的
PassengerSerializer本身有没有正确定义字段 - 父序列化器有没有正确关联实例的乘客数据
比如如果你用了SerializerMethodField但忘了实现对应的获取方法:
class BookingSerializer(serializers.ModelSerializer): passengers = serializers.SerializerMethodField() class Meta: model = Booking fields = ['booking_number', 'passengers', 'status'] # 这里必须补上这个方法,否则serializer.data里不会有passengers字段 def get_passengers(self, obj): return PassengerSerializer(obj.passengers.all(), many=True).data
3.
create/update方法里没正确关联乘客数据 如果你的序列化器重写了create或update方法,但只处理了booking_number和status,没把乘客数据关联到主实例上,那最终的Booking实例里就没有passengers属性,自然读不出来。比如:
def create(self, validated_data): passengers_data = validated_data.pop('passengers') booking = Booking.objects.create(**validated_data) # 一定要加上这段,把乘客数据关联到当前订单 for passenger_data in passengers_data: Passenger.objects.create(booking=booking, **passenger_data) return booking
4. 最后再确认下
fields配置 虽然你说校验通过了,但还是得确认下Meta类里的fields有没有包含passengers——万一不小心漏写了呢?
class Meta: model = Booking fields = ['booking_number', 'passengers', 'status'] # 确保passengers在列表里
先从第一个原因查起,这个概率最高!如果还是不行,再顺着后面的点排查。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

