django DECIMAL类型字段取数据成为字符串

7fyelxc5  于 2022-12-14  发布在  Go
关注(0)|答案(3)|浏览(198)

在我的表中:
我的折扣类型是DECIMAL:

我的数据在表中:

但是为什么当我在API中获取数据时,会得到字符串呢?

我使用Django和Django REST框架作为后端。

belong_product: "实体服务器"
ctime: "2018-04-11T15:41:15.744959+08:00"
desc: ""
discount: "0.005"
id: 1
is_enable: false
max_count: 5
min_count: 0
name: "基数折扣第一阶"
uptime: "2018-04-11T15:41:15.745226+08:00"

我的列表API视图:

class DiscountItemByUserOwnCountListAPIView(ListAPIView):
    serializer_class = DiscountItemByUserOwnCountSerializer
    permission_classes = [IsSuperAdmin]
    pagination_class = CommonPagination
    def get_queryset(self):
        return DiscountItemByUserOwnCount.objects.all()

我的模型:

class DiscountItemByUserOwnCount(models.Model):
    name = models.CharField(max_length=16, help_text="名称")
    desc = models.CharField(max_length=512, null=True, blank=True, help_text="描述")
    min_count = models.IntegerField(help_text="范围的最小数目")
    max_count = models.IntegerField(help_text="范围的最大数目")  # 最小~最大 组成范围
    discount = models.DecimalField(max_digits=4, decimal_places=3, default=0.000, unique=True,
                                   help_text="折点")  # 折点: 0.001
    belong_product = models.CharField(max_length=16, help_text="所属产品(DISCOUNT_PRODUCT_TYPE中去选择)")

    is_enable = models.BooleanField(default=False, help_text="是否启用")

    ctime = models.DateTimeField(auto_now_add=True)
    uptime = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name
    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['min_count', '-id']
vwkv1x7d

vwkv1x7d1#

Django REST框架中默认的十进制表示是字符串。要禁用此行为,请在您的 settings.py 文件中添加以下内容:

REST_FRAMEWORK = {
    'COERCE_DECIMAL_TO_STRING': False,
    # Your other settings
    ...
}

请参阅文档中的详细信息。

kx7yvsdv

kx7yvsdv2#

它是一个字符串,因为否则你会得到舍入误差。这可以很容易地用Python shell看到:

>>> import decimal
>>> from decimal import Decimal
>>> Decimal(0.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
>>> Decimal('0.3')
Decimal('0.3')
>>>

另外请注意,JSON没有小数,只有整数和浮点数。

wljmcqd8

wljmcqd83#

Decimal字段的默认行为是REST_FRAMEWORK中的字符串,以覆盖我们可以使用的整个应用程序

REST_FRAMEWORK = {
    'COERCE_DECIMAL_TO_STRING': False,
    # Your other settings
    ...
}

但如果您想为一个字段覆盖它,您可以执行以下操作

field = serializers.DecimalField(coerce_to_string=False)

默认情况下,coerce_to_stringTrue

相关问题