我在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
对象,我应该更改什么?
答案 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
时序列化程序不会调用该方法。