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

标签 django python-3.x django-rest-framework

我有下一个序列化器:

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/

相关文章:

javascript - 是否可以通过 npm(而不是 yarn )打包 Electron-builder?

python - 将文本文件中的数字数据转换为字典

django - django中post_save接收器的顺序是什么?

django - 如何将特定的 Django 应用程序存储在另一个 Postgresql 数据库中

django - DRF - 为额外操作路由额外的 HTTP 方法

python-3.x - Numpy 的按位运算和垃圾收集器

python - SignatureDoesNotMatch - Boto3 Django 存储

javascript - 无法使用 REST API

python - 根据另一个字段的值验证 Django 模型字段?

django - 如何从 Django Form FileField 中提取文件对象