Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django rest框架序列化程序:必需的\u字段_Python_Django_Django Rest Framework_Serialization - Fatal编程技术网

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

Python Django rest框架序列化程序:必需的\u字段,python,django,django-rest-framework,serialization,Python,Django,Django Rest Framework,Serialization,是否可以在序列化程序中将必填字段设置为列表? 我不想在每行中用字段的类型覆盖每个字段,如下所示: name=serializers.CharField(必需=True) description=serializers.CharField(必需=True) date\u start=serializers.DateTimeField(必需=True) date\u end=serializers.DateTimeField(必需=True) 我只想列举字段的名称 类活动StepFirstSeri

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

name=serializers.CharField(必需=True)
description=serializers.CharField(必需=True)
date\u start=serializers.DateTimeField(必需=True)
date\u end=serializers.DateTimeField(必需=True)
我只想列举字段的名称

类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
必填字段=字段

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


您只需对
序列化程序的
get\u字段
方法和任何子类(例如
serializers.ModelSerializer
)稍加扩展即可获得所需的内容:

如图所示,在序列化程序类的
Meta
类中,您可以定义
required\u字段
选项,如果这些字段不是
read only
且没有默认值,则这些字段将被设置为
required

需要注意的一点是,如果您在序列化程序上用
required=False
明确定义了某个字段,并且在
Meta.required\u fields
中也提到了该字段,那么
\uuuuu repr\uu
将显示
required=False
(例如,当您检查
.fields
时)。构造函数(
字段.\uuuuu new\uuuuu
)保留一个
\uKwargs
属性以保留初始参数

这适用于所有显式声明的字段(元类
序列化程序。SerailizerMetaclass
设置序列化程序类上的
\u声明的\u字段
属性),因此使用
只读\u字段
/
只写\u字段
/
额外的\u kwargs
选项也不会影响表示


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

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


您只需对
序列化程序的
get\u字段
方法和任何子类(例如
serializers.ModelSerializer
)稍加扩展即可获得所需的内容:

如图所示,在序列化程序类的
Meta
类中,您可以定义
required\u字段
选项,如果这些字段不是
read only
且没有默认值,则这些字段将被设置为
required

需要注意的一点是,如果您在序列化程序上用
required=False
明确定义了某个字段,并且在
Meta.required\u fields
中也提到了该字段,那么
\uuuuu repr\uu
将显示
required=False
(例如,当您检查
.fields
时)。构造函数(
字段.\uuuuu new\uuuuu
)保留一个
\uKwargs
属性以保留初始参数

这适用于所有显式声明的字段(元类
序列化程序。SerailizerMetaclass
设置序列化程序类上的
\u声明的\u字段
属性),因此使用
只读\u字段
/
只写\u字段
/
额外的\u kwargs
选项也不会影响表示


如果您愿意,您可以覆盖字段的
\uuuu repr\uuuu
来更改此设置,但我认为您不应该这样做,因为这会破坏与设计其余部分的一致性。

如果模型中的属性不是
null=True
blank=True
,序列化程序会将每个字段设置为
required=True

否则,您可以执行以下操作:

类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
#第一种选择。如果某些字段是必需的
额外费用={
'name':{'required':True},
'description':{'required':True},
'date_start':{'required':True},
'date_end':{'required':True},
}
#第二种选择。如果所有字段都是必填字段:
extra_kwargs={i:{'required':True}表示字段中的i}

如果模型中的属性不是
null=True
blank=True
,序列化程序将每个字段设置为
required=True

否则,您可以执行以下操作:

类活动StepFirstSerializer(serializers.ModelSerializer):
类元:
模型=活动
字段=(
“姓名”,
“说明”,
“开始日期”,
“结束日期”,
)
#第一种选择。如果某些字段是必需的
额外费用={
'name':{'required':True},
'description':{'required':True},
'date_start':{'required':True},
'date_end':{'required':True},
}
#第二种选择。如果所有字段都是requ
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