gpt4 book ai didi

django - 将所有序列化器字段设置为必需

转载 作者:行者123 更新时间:2023-12-02 21:15:01 27 4
gpt4 key购买 nike

我有下一个序列化器:

class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address

class ClientSerializer(serializers.ModelSerializer):
address = AddressSerializer()
class Meta:
model = Client
fields = ('id', 'email', 'address')

型号:

class Address(models.Model):
street = models.CharField(max_length=50, default='')
zip = models.CharField(max_length=5, default='')
state = models.CharField(max_length=50, choices=STATES ,default='')
suburb = models.CharField(max_length=50, default='')
num = models.CharField(max_length=7, blank=True, default='')
country = models.CharField(max_length=50, default='')
ref = models.CharField(max_length=120, blank=True)

class Client(models.Model):
address = models.OneToOneField(Address, null=True)
email = models.EmailField(unique=True, default='')

预期的行为是拥有所需的所有 AddressSerializer 字段,但事实并非如此

当我检查客户端列表 API View 中的选项时,我得到的地址如下:

"address": {
"type": "field",
"required": true,
"read_only": false,
"label": "Address"
}

但是当我检查地址列表 api 时,我的所有字段都是可选的:

"street": {
"type": "string",
"required": false,
"read_only": false,
"label": "Street",
"max_length": 50
},
"state": {
"type": "string",
"required": false,
"read_only": false,
"label": "State",
"max_length": 50
},
"zip": {
"type": "string",
"required": false,
"read_only": false,
"label": "ZIP",
"max_length": 5
},

为什么应该是必填的字段却不是?

如何在不使用 extra_kwargs 参数的情况下将所有字段设置为必填?

最佳答案

if model_field.has_default() or model_field.blank or model_field.null:
kwargs['required'] = False

上面是 DRF 3.1.2 源代码的摘录,显示了如何确定 ModelSerializer 自动生成的序列化器字段的 required 属性。

您所观察到的情况是设计使然。如果您希望自动生成的序列化器字段具有 required = True 属性,则其对应的模型字段既不能有默认值,也不能接受空白或 null。

关于django - 将所有序列化器字段设置为必需,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31285180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com