Python Django rest框架序列化程序:必需的\u字段
是否可以在序列化程序中将必填字段设置为列表? 我不想在每行中用字段的类型覆盖每个字段,如下所示:Python Django rest框架序列化程序:必需的\u字段,python,django,django-rest-framework,serialization,Python,Django,Django Rest Framework,Serialization,是否可以在序列化程序中将必填字段设置为列表? 我不想在每行中用字段的类型覆盖每个字段,如下所示: name=serializers.CharField(必需=True) description=serializers.CharField(必需=True) date\u start=serializers.DateTimeField(必需=True) date\u end=serializers.DateTimeField(必需=True) 我只想列举字段的名称 类活动StepFirstSeri
name=serializers.CharField(必需=True)
description=serializers.CharField(必需=True)
date\u start=serializers.DateTimeField(必需=True)
date\u end=serializers.DateTimeField(必需=True)
我只想列举字段的名称
类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
必填字段=字段
DRF中没有此类选项。使用Meta
可以得到的最接近的方法是extra_kwargs
(假设您使用的是serializers.ModelSerializer
),分别提到字段名,值是带有{'required':True}
的dict。但这比在初始化字段时明确提到required=True
要复杂得多
您只需对
序列化程序的get\u字段方法和任何子类(例如serializers.ModelSerializer
)稍加扩展即可获得所需的内容:
如图所示,在序列化程序类的Meta
类中,您可以定义required\u字段
选项,如果这些字段不是read only
且没有默认值,则这些字段将被设置为required
需要注意的一点是,如果您在序列化程序上用required=False
明确定义了某个字段,并且在Meta.required\u fields
中也提到了该字段,那么\uuuuu repr\uu
将显示required=False
(例如,当您检查.fields
时)。构造函数(字段.\uuuuu new\uuuuu
)保留一个\uKwargs
属性以保留初始参数
这适用于所有显式声明的字段(元类序列化程序。SerailizerMetaclass
设置序列化程序类上的\u声明的\u字段
属性),因此使用只读\u字段
/只写\u字段
/额外的\u kwargs
元
选项也不会影响表示
如果需要,您可以覆盖该字段的\uuuu repr\uuuu
来更改此项,但我认为您不应该这样做,因为这样会破坏与其他设计的一致性。DRF中没有此类选项。使用Meta
可以得到的最接近的方法是extra_kwargs
(假设您使用的是serializers.ModelSerializer
),分别提到字段名,值是带有{'required':True}
的dict。但这比在初始化字段时明确提到required=True
要复杂得多
您只需对序列化程序的get\u字段方法和任何子类(例如serializers.ModelSerializer
)稍加扩展即可获得所需的内容:
如图所示,在序列化程序类的Meta
类中,您可以定义required\u字段
选项,如果这些字段不是read only
且没有默认值,则这些字段将被设置为required
需要注意的一点是,如果您在序列化程序上用required=False
明确定义了某个字段,并且在Meta.required\u fields
中也提到了该字段,那么\uuuuu repr\uu
将显示required=False
(例如,当您检查.fields
时)。构造函数(字段.\uuuuu new\uuuuu
)保留一个\uKwargs
属性以保留初始参数
这适用于所有显式声明的字段(元类序列化程序。SerailizerMetaclass
设置序列化程序类上的\u声明的\u字段
属性),因此使用只读\u字段
/只写\u字段
/额外的\u kwargs
元
选项也不会影响表示
如果您愿意,您可以覆盖字段的\uuuu repr\uuuu
来更改此设置,但我认为您不应该这样做,因为这会破坏与设计其余部分的一致性。如果模型中的属性不是null=True
或blank=True
,序列化程序会将每个字段设置为required=True
否则,您可以执行以下操作:
类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
#第一种选择。如果某些字段是必需的
额外费用={
'name':{'required':True},
'description':{'required':True},
'date_start':{'required':True},
'date_end':{'required':True},
}
#第二种选择。如果所有字段都是必填字段:
extra_kwargs={i:{'required':True}表示字段中的i}
如果模型中的属性不是null=True
或blank=True
,序列化程序将每个字段设置为required=True
否则,您可以执行以下操作:
类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
#第一种选择。如果某些字段是必需的
额外费用={
'name':{'required':True},
'description':{'required':True},
'date_start':{'required':True},
'date_end':{'required':True},
}
#第二种选择。如果所有字段都是requ
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