Я сталкиваюсь с проблемой парадигмы здесь. Я не знаю, должен ли я сохранить деньги как Десятичное число (), или если я должен сохранить их как строку и преобразовать их в десятичное число сам. Мое обоснование - это:
PayPal требует 2 десятичных разрядов, поэтому если у меня есть продукт, который составляет 49 долларов даже, PayPal хочет видеть 49.00 сталкиваться с проводом. DecimalField Django () не устанавливает десятичную сумму. Это только хранит максимальное количество десятичных разрядов. Так, если Вы будете иметь 49 там, и Вам установили поле на 2 десятичных разряда, то оно все еще сохранит его как 49. Я знаю, что Django является в основном преобразованием типа, когда оно десериализовывает назад от базы данных в Десятичное число (так как Базы данных не имеют десятичных полей), таким образом, я не полностью обеспокоен проблемами скорости так же, как я с вопросами проектирования этой проблемы. Я хочу сделать то, что является лучшим для расширяемости.
Или, еще лучше, делает любой знает, как настроить django DecimalField (), чтобы всегда отформатировать со стилем форматирования TWO_PLACES.
Возможно, вы захотите использовать метод .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: Почему это поле пользовательской модели ведет себя не так, как ожидалось?
Вы храните его как десятичное поле и вручную добавляете десятичные знаки, если вам нужно, как сказал Валя, использовать базовые методы форматирования.
Вы даже можете добавить метод Model Method к своему продукту или модели транзакции, который будет выплевывать десятичное поле как строку соответствующего форматирования.
.] я предлагаю избегать смешивания представления с хранением. Хранить данные в виде десятичного значения в 2-х местах.[
] []В слое пользовательского интерфейса отображать их в удобной для пользователя форме (поэтому, возможно, опустить ".00").[
] []При отправке данных в PayPal, отформатируйте их в соответствии с требованиями интерфейса.[
].Я думаю, вам следует сохранить его в десятичном формате и отформатировать в формате 00.00 только , а затем отправить его в PayPal, например:
pricestr = "%01.2f" % price
Если хотите, вы можете добавить метод к вашей модели:
def formattedprice(self):
return "%01.2f" % self.price