Django Rest Framework在从属性派生时提供错误的类型序列化器字段类型

时间:2015-12-21 21:27:54

标签: django serialization django-rest-framework

假设我有这个CartItem和OrderItem模型:

class CartItem(Model):
    price = DecimalField(..)


class OrderItem(Model):
    cartitem = OneToOneField('CartItem')

    @property
    def price(self):
        return self.cartitem.price

当使用ModelSerializer并让它来隐式确定呈现OrderItem的字段时,price字段将变为float类型。

例如。 'price': 10.5但我希望看到'price': '10.5'

我需要在序列化程序中明确指定DecimalField以生成正确的十进制类型,如下所示:

class OrderItemSerializer(ModelSerializer):
    price = DecimalField(...)

我错过了什么吗?

更新:这是我在github上提出的问题: Django Rest Framework gives wrong type serializer field type when derived from properties

1 个答案:

答案 0 :(得分:0)

基于DRF存储库中的issue 582,从版本2.1.16开始,DecimalField将返回字符串,但也会更改值。

>>> from decimal import Decimal
>>> from rest_framework import renderers
>>> 
>>> obj = {'foo': ['bar', 'baz'], 'float': 1.1, 'decimal': Decimal(1.1)}
>>> 
>>> renderers.JSONRenderer().render(obj, 'application/json')
'{"float": 1.1, "decimal": "1.100000000000000088817841970012523233890533447265625", "foo": ["bar", "baz"]}'`

我建议使用自定义属性,而不是DecimalField使用SerializerMethodField

class OrderItemSerializer(ModelSerializer):
    price = SerializerMethodField()

    def get_price(self, obj):
        return str(obj.price)