繁体   English   中英

Django 休息框架序列化程序:required_fields

[英]Django rest framework serializer: required_fields

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

    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

如果模型中的属性不是null=Trueblank=True ,则序列化程序会将每个字段设置为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}

DRF 中没有这样的选项。 您可以使用Meta获得的最接近的是extra_kwargs (假设您使用的是serializers.ModelSerializer ),并分别提及字段名称,值是带有{'required': True}的字典。 但这比在初始化字段时明确提及required=True会做更多的工作。


你可以通过对serializers.Serializers和任何子类(例如serializers.ModelSerializer )的get_fields方法进行一点点扩展来获得你想要的:

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选项,如果这些字段不是read_only并且没有默认值,则这些字段将被设为required

对此的一个警告是,如果您在序列化程序上明确定义了一些字段required=False ,并且还提到了Meta.required_fields中的字段,则__repr__将显示required=False (例如,当您检查<serializer_instance>.fields )。 serializers.Field.__repr__的定义使得创建字段时使用的初始参数按原样显示 构造函数( Field.__new__ )保留一个_kwargs属性以保留初始参数。

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

如果你愿意,你可以覆盖字段的__repr__来改变它,但我认为你不应该这样做,因为这会破坏与设计的其余部分的一致性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM