Django中如何在POST仅传ID时显示嵌套字段并正常提交?
解决方法
你可以通过拆分读写字段的方式实现需求:在序列化器里分别定义用于写入的主键字段,和用于读取的嵌套序列化器字段,下面提供两种可行方案:
方案一:分离读写字段(清晰直观)
class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ("id", "name") class OrderProductSerializer(serializers.ModelSerializer): # 只读字段:返回数据时展示完整的product信息 product = ProductSerializer(read_only=True) # 只写字段:接收POST请求中的product id,关联到外键 product_id = serializers.PrimaryKeyRelatedField( queryset=Product.objects.all(), source='product' ) # 如果order也是外键,同理配置order_id字段 order_id = serializers.PrimaryKeyRelatedField( queryset=Order.objects.all(), source='order' ) class Meta: model = OrderProduct fields = ["id", "order_id", "product_id", "product"]
- POST请求格式:传入
order_id和product_id即可,示例:[ { "order_id": 1, "product_id": 1 } ] - 返回数据格式:自动展示嵌套的product详情,和你期望的输出一致。
方案二:保持原有请求键名(无需修改输入格式)
如果不想改动请求里的键名,依然想用order和product传id,可以用这个方案:
class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ("id", "name") class OrderProductSerializer(serializers.ModelSerializer): # 自定义读取逻辑,返回product详情 product = serializers.SerializerMethodField() class Meta: model = OrderProduct fields = ["id", "order", "product"] # 把原生的order、product字段设为只写,用于接收主键 extra_kwargs = { "order": {"write_only": True}, "product": {"write_only": True} } def get_product(self, obj): # 读取时序列化关联的product对象 return ProductSerializer(obj.product).data
- POST请求格式:完全符合你最初的期望,直接传id即可:
[ { "order": 1, "product": 1 } ] - 返回数据格式:同样会展示嵌套的product详情。
内容的提问来源于stack exchange,提问作者Hakkene
相关产品推荐
相关产品推荐

