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

Django序列化器问题:如何让主键以别名只读显示且创建时非必填

解决方法

问题出在你显式声明orderId字段时,默认的required=True会让DRF在反序列化(创建对象)时校验这个字段是否存在,哪怕你把它加到了read_only_fields里。可以通过以下两种方式解决:

方式一:给显式声明的字段加上read_only=True

直接在orderId字段的定义里添加read_only=True参数,这样该字段只会在序列化(返回给用户)时生效,反序列化(接收用户请求)时会被完全忽略,不会触发必填校验:

class OrderSerializer(serializers.ModelSerializer):
    orderId = serializers.UUIDField(source="id", read_only=True)
    orderName = serializers.CharField(source="name")

    class Meta:
        model = Order
        fields = (
            "orderId",
            "orderName",
        )

这样配置后:

  • GET请求时会以orderId的名称返回主键值
  • POST请求时不需要传orderId,模型会自动生成UUID
  • 也不用再单独设置read_only_fields,因为字段本身已经标记为只读

方式二:保留read_only_fields,同时给字段设置required=False

如果你想保留read_only_fields的配置,可以给orderId字段加上required=False,让DRF在反序列化时不校验该字段的必填性:

class OrderSerializer(serializers.ModelSerializer):
    orderId = serializers.UUIDField(source="id", required=False)
    orderName = serializers.CharField(source="name")

    class Meta:
        model = Order
        fields = (
            "orderId",
            "orderName",
        )
        read_only_fields = ("orderId",)

两种方式效果一致,测试后:POST请求只传orderName就能成功创建订单,返回的响应里会包含自动生成的orderId;GET请求也能正常看到orderId字段。

内容的提问来源于stack exchange,提问作者Brian C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:28