Django rest框架序列化器:required_fields

时间:2019-11-26 19:45:17

标签: python django django-rest-framework serializer

是否可以在序列化程序中将必填字段设置为列表? 我不想像这样在每行中覆盖每个字段的类型:

    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

2 个答案:

答案 0 :(得分:2)

如果模型中的属性不是 null=Trueblank=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来更改此设置,但我认为您不应该这样做,因为这会破坏与设计其余部分的一致性。