Django rest框架序列化程序:必需的\u字段

2024-04-27 00:56:17 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在序列化程序中将必填字段设置为列表? 我不想用每行中的类型覆盖每个字段,如下所示:

    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

Tags: name程序truefieldsdate序列化requireddescription
1条回答
网友
1楼 · 发布于 2024-04-27 00:56:17

在DRF中没有这样的选项。使用Meta可以得到的最接近的是extra_kwargs(假设您使用的是serializers.ModelSerializer),分别提到字段名,值是带有{'required': True}的dict。但这比在初始化字段时显式地提到required=True要复杂得多。你知道吗


只需对serializers.Serializersget_fields方法和任何子类(例如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

如图所示,在serializer类的Meta类中,您可以定义required_fields选项,如果这些字段不是read_only并且没有默认值,则这些字段将变为required。你知道吗

需要注意的一点是,如果在序列化程序上用required=False显式定义了某个字段,并且在Meta.required_fields中提到了该字段,__repr__将显示required=False(例如,当您检查<serializer_instance>.fields)。^{} is defined such that the initial arguments used in the creation of a field are shown as-is。构造函数(Field.__new__)保留一个_kwargs属性以保留初始参数。你知道吗

这适用于所有显式声明的字段(元类serializers.SerailizerMetaclass在序列化程序类上设置_declared_fields属性),因此使用read_only_fields/write_only_fields/extra_kwargsMeta选项也不会影响表示。你知道吗

如果需要,可以重写该字段的__repr__来更改此项,但我认为不应该这样做,因为这样会破坏与其他设计的一致性。你知道吗

相关问题 更多 >