Django rest framework serializer:required_fields

问题描述 投票:1回答:1

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

    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
python django django-rest-framework serializer
1个回答
0
投票

DRF中没有这样的选项。用Meta可以得到的最接近的是extra_kwargs(假设您使用的是serializers.ModelSerializer),并单独提及字段名称,其值是{'required': True}的字典。但这比在初始化字段时显式提及required=True还要多。


您可以通过扩展get_fieldsserializers.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_fieldsextra_kwargs选项也不会影响表示形式。

如果需要,您可以覆盖字段的Meta来更改此设置,但我认为您不应该这样做,因为那样会破坏与其余设计的一致性。

© www.soinside.com 2019 - 2024. All rights reserved.