我有下一个序列化器:
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/