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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:50:18