是否可以在序列化程序中将必填字段设置为列表? 我不想像这样在每行中覆盖每个字段的类型:
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
答案 0 :(得分:2)
如果模型中的属性不是 null=True
或 blank=True
,Serializer 会将每个字段设置为 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}
答案 1 :(得分:0)
DRF中没有此类选项。使用Meta
可以得到的最接近的是extra_kwargs
(假设您使用的是serializers.ModelSerializer
),并分别提及字段名称,其中值是{'required': True}
的字典。但这比在初始化字段时显式提及required=True
还要困难。
只需对get_fields
的{{1}}方法和任何子类(例如serializers.Serializers
)进行一点扩展,即可获得所需的内容:
serializers.ModelSerializer
如图所示,在序列化程序类的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
,则将这些字段设置为required
并且没有默认值。
一个警告是,如果您在序列化程序上使用read_only
明确定义了一些字段,并且在required=False
中提到了该字段,则Meta.required_fields
将显示{{1 }}(例如,当您检查__repr__
时)。 CloudSDK for Pyhton。构造函数(required=False
保留了<serializer_instance>.fields
属性以保留初始参数。
这适用于所有显式声明的字段(串行器类上的元类Field.__new__
设置了_kwargs
属性),因此使用serializers.SerailizerMetaclass
/ _declared_fields
/ read_only_fields
write_only_fields
选项也不会影响表示。
如果需要,您可以覆盖字段的extra_kwargs
来更改此设置,但我认为您不应该这样做,因为这会破坏与设计其余部分的一致性。