【问题标题】:How to make a validate_data field optional?如何使 validate_data 字段可选?
【发布时间】:2018-10-11 15:39:25
【问题描述】:

我正在尝试创建一个 RESTful api 端点来创建新用户。这就是我放入我的 serializer.py 中的内容

class UserSerializer(serializers.ModelSerializer):
    Class Meta:
        model = User
        field = ('name', 'division', 'image',)
        extra_kwargs = {'division': {'required': False}}

    def create(self, validated_data):
        newUser = User.objects.create(
           name = validated_data['name'],
           division = validated_data['division']
           image = validated_data['image']
        )
        return newUser;

现在我想做的是我想让除法是可选的,例如,如果输入除法是“教育”,那么放教育是我的数据库表;但如果没有输入,则将其设为空。怎么可能实现呢?

【问题讨论】:

  • 如果该字段在您的模型定义中是可选的(即具有null=Trueblank=True),您不必在序列化程序中执行任何操作。您可以发布User 模型的代码吗?

标签: python django django-models django-rest-framework django-serializer


【解决方案1】:

要使字段可选,您可以使用extra_kwargs dict。为了使它起作用,必须在 fields 中显式声明该字段。

class FooSerializer(serializers.ModelSerializer):
    ...

    class Meta:
        ...
        fields = ('bar', 'baz',)
        extra_kwargs = {'bar': {'required': False}}

一般来说,尽量不要使用fields = '__all__',而是显式声明字段。这将保护您以后不会意外暴露敏感字段。

【讨论】:

  • 我实际上在字段下添加了这个,但它不起作用。我已经更新了我的代码
  • 要使用extra_kwargs,您必须明确指定fields = ('name', 'division', 'image',)等字段。
  • 即使我指定了字段也不起作用。当我发出 POST 请求时,它仍然会询问该字段。
【解决方案2】:

你可以试试这个:

def create(self, validated_data):
    division = None
    if validated_data['division']:
        division = validated_data['division']
    newUser = User.objects.create(
        name = validated_data['name'],
        division = division
        image = validated_data['image']
    )
    return newUser;

【讨论】:

  • 是的。我确实想通了。但是,如果我有超过 10 个可能为空的不同字段,而我必须为每个字段创建 if 语句呢?
猜你喜欢
  • 2022-01-01
  • 2019-06-14
  • 2014-06-09
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2020-02-17
  • 2018-06-26
相关资源
最近更新 更多