Django:我应该如何存储货币价值? - python

我在这里遇到范式问题。我不知道该将钱存储为Decimal(),还是将其存储为字符串并将自己转换为十进制。我的推理是这样的:

PayPal要求小数点后两位为,因此,如果我有49美元的产品,PayPal希望看到49.00。 Django的DecimalField()并未设置小数位数。它仅存储最大小数位数。因此,如果其中有49个字段,并且将字段设置为2个小数位,它仍将其存储为49个。我知道Django从数据库反序列化为Decimal时基本上就是类型转换(因为Databases (没有小数字段),因此我对速度问题的关注程度与对这个问题的设计问题的关注程度一样。我想做最好的可扩展性。

或者,更好的是,没有人知道如何将django DecimalField()配置为始终使用TWO_PLACES格式化样式进行格式化。

参考方案

您可能要使用.quantize()方法。这会将十进制值四舍五入到一定位数,您提供的参数指定位数:

>>> from decimal import Decimal
>>> Decimal("12.234").quantize(Decimal("0.00"))
Decimal("12.23")

它还可以使用一个参数来指定所需的舍入方法(不同的会计系统可能需要不同的舍入)。在Python docs中有更多信息。

下面是一个自定义字段,它会自动产生正确的值。请注意,这仅是从数据库中检索到的,并且在您自行设置时不会帮助您(直到将其保存到数据库并再次检索!)。

from django.db import models
from decimal import Decimal
class CurrencyField(models.DecimalField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        try:
           return super(CurrencyField, self).to_python(value).quantize(Decimal("0.01"))
        except AttributeError:
           return None

[编辑]

添加了__metaclass__,请参见Django: Why does this custom model field not behave as expected?

Django Python日期时间设置为午夜 - python

我有django对象的日期时间,但可以是一天中的任何时间。它可以是一天中的任何时间,但我需要将时间设置为00:00:00(另一个日期设置为23:59:59,但原理是相同的)end_date = lastItem.pub_date 当前的结束日期是2002-01-11 12:34:56我需要怎么做才能将其更改为00:00:00?我试过了:end_date.ho…

处理后如何删除照片? - python

我的Django模型中有两个字段: class Staff(models.Model): photo = models.FileField(blank=True, null = True) encodings = JSONField() 我从表单获取照片,然后使用该照片获取编码。处理后如何删除照片?我试过了self.photo = None or self.…

Django:使用contenttypes框架的一般关系示例? - python

我已经多次浏览了有关contenttypes框架的Django文档,但我对它的理解不足以在项目中实现泛型关系。我一直在寻找有关此事的在线示例或教程,但找不到一个。称我为哑巴,但在这方面我需要一些帮助(请不要仅通过链接到文档来回答问题)。基于在线资源的缺乏,我相信如果您用一个完整的例子来回答这个问题,您的答案可能是迄今为止有关django通用关系(奖金!)的最…

Django:DateField“此字段不能为空。” - python

我发布这样的休息请求:{title:some title, recurring:true, day:Wednesday, time:12:30, description:some text} 我没有传递日期,因为该事件重复发生,并且该值应该为空。服务器响应为:{"date": ["This field cannot be bla…

Django BigInteger自动递增字段作为主键? - python

我目前正在建立一个涉及大量集体智慧的项目。每个访问该网站的用户都将创建一个唯一的配置文件,然后将他们的数据用于为自己和其他用户计算最佳匹配。默认情况下,Django创建一个INT(11)id字段来处理模型的主键。我担心这会很快溢出(即,大约2.4b个设备在未事先设置Cookie的情况下访问了该页面)。如何在MySQL中将其更改为BIGINT并在Django自…