Django REST框架在IntegerField

时间:2015-07-09 21:22:45

标签: django django-rest-framework

我在Django中有一个带有IntegerField的模型:

class MyModel(models.Model):
    number = models.IntegerField(default=0)

我使用Django REST Framework的模型序列化器:

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel

REST框架创建的JSON是:

{
    "number": null
}

问题是,如果我只是按照收到的那样回复,则验证失败。为了使收到的JSON对象使用0而不是null对象,我应该更改什么?

2 个答案:

答案 0 :(得分:3)

正如Mark Galloway所评论的,如果数据库中有空数据,则会出现null。您可以通过更改序列化程序中的验证登录来解决此问题:

class MySerializer(serializers.ModelSerializer):
    number = models.IntegerField(initial=0, allow_null=True)
    class Meta:
        model = MyModel

或通过更改数据序列化回用户的方式:

class MyIntegerField(serializers.IntegerField):
    def to_representation(self, value):
        if value is None:
            return 0
        return super(MyIntegerField, self).to_representation(value)

class MySerializer(serializers.ModelSerializer):
    number = MyIntegerField(initial=0)
    class Meta:
        model = MyModel

答案 1 :(得分:0)

我创建了这个 Serializer 字段来将空值呈现为 0。

from rest_framework import fields, serializers

class IntegerDefaultField(fields.IntegerField):
    def get_attribute(self, instance):
        attibute = super().get_attribute(instance)
        if attibute is None and self.default != fields.empty:
            attibute = self.default
        return attibute

class ExampleSerializer(serializers.Serializer):
    number = IntegerDefaultField(default=0)

覆盖 to_representation 对我不起作用,因为当字段值为 None 时序列化程序不会调用该方法。