【问题标题】:django DecimalField - how do I retrieve the value as a float?django DecimalField - 如何将值作为浮点数检索?
【发布时间】:2015-06-02 16:57:31
【问题描述】:

如果我知道将模型数据序列化为 JSON 有多么困难,我永远不会使用 Django 的 DecimalField 选项。

长话短说,我如何从DecimalField 获取浮点值?

我的模型如下所示:

class DailyReport(models.Model):
    earnings = models.DecimalField(max_digits=12, decimal_places=4)

    def earnings_float(self):
        return self.earnings.to_float()

显然没有可用的to_float() 方法,那我该怎么做呢?

以下是后期补充:

这行得通:

class DailyReport(models.Model):
    earnings = models.DecimalField(max_digits=12, decimal_places=4)

    def earnings_float(self):
        return float(self.earnings)

但即使这样似乎也太复杂了。我正在尝试使用 django-rest-framework 进行所有序列化,因为我通常将它用于我的应用程序中的 rest-framework 内容。在这种特殊情况下,我只想将我的数据转换和序列化为 python 列表和字典,然后通过 pymongo 3 将它们作为文档存储在 Mongo DB 中。

【问题讨论】:

  • @IgnacioVazquez-Abrams 没有充分解决我的问题

标签: django django-models


【解决方案1】:

3.0 提供了将小数序列化为浮点数的选项。

https://github.com/tomchristie/django-rest-framework/blob/version-3.0/docs/topics/3.0-announcement.md#decimals-as-strings-in-serializer-data

REST_FRAMEWORK = {
    'COERCE_DECIMAL_TO_STRING': False
}

【讨论】:

    【解决方案2】:

    浮点数和小数不一样。不要为了序列化而将小数转换为浮点数;你会失去精确度。

    而只是使用 DjangoJSONEncoder 类,它工作得很好:

    from django.core.serializers import DjangoJSONEncoder
    json.dumps(self.earnings, encoder=DjangoJSONEncoder)
    

    【讨论】:

    • 我注意到 DjangoJSONEncoder 在 django 版本 1.8 中的 django.core.serializers.json 中,所以语句来自 django.core.serializers.json import DjangoJSONEncoder
    • 我认为属性应该是cls而不是encoder。所以序列化语句会是这样的 json.dumps(self.earnings, cls=DjangoJSONEncoder)
    【解决方案3】:

    只需将 DecimalField 转换为浮点数:

    def earnings_float(self):
            return float(self.earnings)
    

    【讨论】:

    • 请注意 DecimalField 可以是 None 并且 float() 将抛出 TypeError 如果您尝试投射它。
    【解决方案4】:

    可以让序列化程序将其转换为浮点字段。

    rest-framework declaring-serializers

    from rest_framework import serializers
    
    class DailyReportSerializer(serializers.ModelSerializer):
        earnings = serializers.FloatField()
    
        class Meta:
            model = DailyReport
            fields = ('earnings',)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2012-08-12
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多