Django: Как я должен сохранить денежное значение?

Я сталкиваюсь с проблемой парадигмы здесь. Я не знаю, должен ли я сохранить деньги как Десятичное число (), или если я должен сохранить их как строку и преобразовать их в десятичное число сам. Мое обоснование - это:

PayPal требует 2 десятичных разрядов, поэтому если у меня есть продукт, который составляет 49 долларов даже, PayPal хочет видеть 49.00 сталкиваться с проводом. DecimalField Django () не устанавливает десятичную сумму. Это только хранит максимальное количество десятичных разрядов. Так, если Вы будете иметь 49 там, и Вам установили поле на 2 десятичных разряда, то оно все еще сохранит его как 49. Я знаю, что Django является в основном преобразованием типа, когда оно десериализовывает назад от базы данных в Десятичное число (так как Базы данных не имеют десятичных полей), таким образом, я не полностью обеспокоен проблемами скорости так же, как я с вопросами проектирования этой проблемы. Я хочу сделать то, что является лучшим для расширяемости.

Или, еще лучше, делает любой знает, как настроить django DecimalField (), чтобы всегда отформатировать со стилем форматирования TWO_PLACES.

63
задан orokusaki 6 January 2010 в 15:09
поделиться

4 ответа

Возможно, вы захотите использовать метод .quantize(). Это округлит десятичное значение до определенного количества мест, аргумент, который вы предоставляете, указывает количество мест:

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

Он также может принять аргумент, чтобы указать, какой подход к округлению вы хотите (различные системы бухгалтерского учета могут хотеть разного округления). Более подробная информация приведена в Python docs.

Ниже представлено пользовательское поле, которое автоматически производит правильное значение. Обратите внимание, что это только тогда, когда оно извлекается из базы данных, и не поможет вам, когда вы установите его самостоятельно (пока вы не сохраните его в db и не извлечете снова!).

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: Почему это поле пользовательской модели ведет себя не так, как ожидалось?

62
ответ дан 24 November 2019 в 16:19
поделиться

Вы храните его как десятичное поле и вручную добавляете десятичные знаки, если вам нужно, как сказал Валя, использовать базовые методы форматирования.

Вы даже можете добавить метод Model Method к своему продукту или модели транзакции, который будет выплевывать десятичное поле как строку соответствующего форматирования.

.
1
ответ дан 24 November 2019 в 16:19
поделиться
[

] я предлагаю избегать смешивания представления с хранением. Хранить данные в виде десятичного значения в 2-х местах.[

] [

]В слое пользовательского интерфейса отображать их в удобной для пользователя форме (поэтому, возможно, опустить ".00").[

] [

]При отправке данных в PayPal, отформатируйте их в соответствии с требованиями интерфейса.[

].
10
ответ дан 24 November 2019 в 16:19
поделиться

Я думаю, вам следует сохранить его в десятичном формате и отформатировать в формате 00.00 только , а затем отправить его в PayPal, например:

pricestr = "%01.2f" % price

Если хотите, вы можете добавить метод к вашей модели:

def formattedprice(self):
    return "%01.2f" % self.price
18
ответ дан 24 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: