假设我有这个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
答案 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)