You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:50:34