【问题标题】:How can I set default value in serializers?如何在序列化程序中设置默认值?
【发布时间】:2015-12-11 03:19:51
【问题描述】:

我有这些序列化程序:

>---id = serializers.IntegerField()
>---name = serializers.CharField()
>---age = serializers.IntegerField()  

现在,我给序列化器这个数据:

{'id': 1, 'name': 'cc'}

我没有给出age 的值。 如何在序列化程序中将默认值设置为 age

我想得到这个,12 是默认值:

{'id': 1, 'name': 'cc', 'age': 12}

【问题讨论】:

  • 您需要具体说明,它是什么类型的序列化器(modelserializer 或普通序列化器?)您能显示完整的序列化器定义吗?如果模型序列化程序显示模型定义

标签: django django-rest-framework


【解决方案1】:

正如你所说,你没有模型

1.serializer.py

class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    age = serializers.IntegerField(default=12) #if key age is missing, value of age become 12

    def validate(self,data):
        #other wise you can set default value of age here,
        if data.get('age',None)==None: #this conditon will be true only when age = serializer.IntergerField(required=False)
            data['age']=12
        return data

views.py

serializer = UserSerializer(data={'id': 1, 'name': 'cc', 'age': 14})
serializer.is_valid()
# True
serializer.validated_data
# {'id': 1, 'name': 'cc', 'age': 14} 

或者如果你错过了在 views.py 中指定年龄

serializer = UserSerializer(data={'id': 1, 'name': 'cc'})
serializer.is_valid()
# True
serializer.validated_data
# {'id': 1, 'name': 'cc', 'age': 12} 

希望这对某人有所帮助:)

【讨论】:

  • 这可行,但最好使用 SerializerMethodField,这样您就不必重写 validate。此外,在与 none 进行比较时,建议使用 is 而不是 ==
【解决方案2】:
age = serializers.IntegerField(default=12, initial=12)

初始预填充 html 表单。 见docs

【讨论】:

  • 它在序列化程序 OverViewSerializer 上给我错误 KeyError: u"Got KeyError when attempting to get a value for field age`。\n序列化程序字段可能命名不正确,并且与 dict 实例上的任何属性或键都不匹配。\n原始异常文本是: u'age'。"`
  • @nataila 你能用你的序列化代码更新你的问题吗?我期待您继承 ModelSerializer 并且“年龄”也是相关模型中的一个字段。
  • @nataila 在这种情况下,您需要更具体地了解您要做什么并提供一些代码... :)
【解决方案3】:

如果您将模型字段设为空白,您可以设置一个默认值,如果您未在 POST 上提供值,则该默认值将被填写:

class Foo(models.Model):
    bar = models.IntegerField(blank=True, default=42)
                             #^^^^^^^^^^  ^^^^^^^^^^

那么,当你POST 使用{} 作为数据时

【解决方案4】:

你想在序列化器中设置吗?

class PersonSerializer(serializers.ModelSerializer):
   age = serializers.SerializerMethodField()

   def get_age(self, obj):
       return getattr(obj, 'age', 12)

   class Meta:
       model = Person
       field = ('id', 'name', 'age')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 2021-11-22
    • 2020-05-31
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多