如何在序列化器中设置默认值?

nat*_*ila 9 django django-rest-framework

我有这些序列化器:

>---id = serializers.IntegerField()
>---name = serializers.CharField()
>---age = serializers.IntegerField()  
Run Code Online (Sandbox Code Playgroud)

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

{'id': 1, 'name': 'cc'}
Run Code Online (Sandbox Code Playgroud)

我没有给出价值age.如何age在序列化器中设置默认值?

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

{'id': 1, 'name': 'cc', 'age': 12}
Run Code Online (Sandbox Code Playgroud)

小智 10

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

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')
Run Code Online (Sandbox Code Playgroud)


Sat*_*eet 9

age = serializers.IntegerField(default=12, initial=12)
Run Code Online (Sandbox Code Playgroud)

初始化为预填充html表单.查看文档


vij*_*jay 8

如您所说,您没有模特

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
Run Code Online (Sandbox Code Playgroud)

views.py

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

或者,如果您错过了在views.py中指定年龄的信息

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

希望这可以帮助某人:)

  • 这可行,但最好使用 SerializerMethodField,这样您就不必重写 validate。此外,建议在与 none 进行比较时使用 `is` 而不是 `==` (3认同)

Ros*_*ers 7

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

class Foo(models.Model):
    bar = models.IntegerField(blank=True, default=42)
                             #^^^^^^^^^^  ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

然后,当您POST使用{}的数据

  • [是的,这是 xy 问题空间。](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378) (3认同)