是否可以将必需字段设置为序列化程序内的列表?我不想像这样在每行中覆盖每个字段的类型:
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
DRF中没有这样的选项。用Meta
可以得到的最接近的是extra_kwargs
(假设您使用的是serializers.ModelSerializer
),并单独提及字段名称,其值是{'required': True}
的字典。但这比在初始化字段时显式提及required=True
还要多。
您可以通过扩展get_fields
的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
中的字段,则__repr__
将显示required=False
(例如,当您将检查<serializer_instance>.fields
)。serializers.Field.__repr__
is defined such that the initial arguments used in the creation of a field are shown as-is。
这适用于所有显式声明的字段(元类serializers.Field.__repr__
设置序列化程序类上的serializers.SerailizerMetaclass
属性),因此使用_declared_fields
/read_only_fields
/write_only_fields
extra_kwargs
选项也不会影响表示形式。
如果需要,您可以覆盖字段的Meta
来更改此设置,但我认为您不应该这样做,因为那样会破坏与其余设计的一致性。