[英]django-rest-framework how to make model serializer fields required
[英]Django rest framework serializer: required_fields
是否可以将必填字段设置为序列化程序中的列表? 我不想在每一行中用它们的类型覆盖每个字段,如下所示:
name = serializers.CharField(required=True)
description = serializers.CharField(required=True)
date_start = serializers.DateTimeField(required=True)
date_end = serializers.DateTimeField(required=True)
我只想枚举字段的名称
class CampaignStepFirstSerializer(serializers.ModelSerializer):
class Meta:
model = Campaign
fields = (
'name',
'description',
'date_start',
'date_end',
)
required_fields = fields
如果模型中的属性不是null=True
或blank=True
,则序列化程序会将每个字段设置为required=True
。
否则,您可以这样做:
class CampaignStepFirstSerializer(serializers.ModelSerializer):
class Meta:
model = Campaign
fields = (
'name',
'description',
'date_start',
'date_end',
)
# 1st option. If some fields are required
extra_kwargs = {
'name': {'required': True},
'description': {'required': True},
'date_start': {'required': True},
'date_end': {'required': True},
}
# 2nd option. If all the fields are required:
extra_kwargs = {i:{'required': True} for i in fields}
DRF 中没有这样的选项。 您可以使用Meta
获得的最接近的是extra_kwargs
(假设您使用的是serializers.ModelSerializer
),并分别提及字段名称,值是带有{'required': True}
的字典。 但这比在初始化字段时明确提及required=True
会做更多的工作。
你可以通过对serializers.Serializers
和任何子类(例如serializers.ModelSerializer
)的get_fields
方法进行一点点扩展来获得你想要的:
class CampaignStepFirstSerializer(serializers.ModelSerializer):
def get_fields(self):
fields = super().get_fields()
try:
required_fields = self.Meta.required_fields
except AttributeError:
return fields
if not isinstance(required_fields, (list, tuple)):
raise TypeError(
'The value of `Meta.required_fields` option must be a list or tuple.'
)
for field_name in required_fields:
try:
field = fields[field_name]
except KeyError:
continue
if (
not field.read_only and
field.default is serializers.empty
):
field.required = True
fields[field_name] = field
return fields
class Meta:
model = Campaign
fields = (
'name',
'description',
'date_start',
'date_end',
)
required_fields = fields
如图所示,在序列化器类的Meta
类中,您可以定义required_fields
选项,如果这些字段不是read_only
并且没有默认值,则这些字段将被设为required
。
对此的一个警告是,如果您在序列化程序上明确定义了一些字段required=False
,并且还提到了Meta.required_fields
中的字段,则__repr__
将显示required=False
(例如,当您检查<serializer_instance>.fields
)。 serializers.Field.__repr__
的定义使得创建字段时使用的初始参数按原样显示。 构造函数( Field.__new__
)保留一个_kwargs
属性以保留初始参数。
这适用于所有显式声明的字段(元类serializers.SerailizerMetaclass
在序列化器类上设置_declared_fields
属性),因此使用read_only_fields
/ write_only_fields
/ extra_kwargs
Meta
选项也不会影响表示。
如果你愿意,你可以覆盖字段的__repr__
来改变它,但我认为你不应该这样做,因为这会破坏与设计的其余部分的一致性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.