джанго смарт десятичное поле - PullRequest
1 голос
/ 25 октября 2011

Я создаю приложение, которое в основном хранит размеры обуви, наряду с другой информацией.Я использовал поле Django Decimal для хранения размеров, однако в десятичном поле хранятся размеры, такие как 10, как 10.0, поэтому мой вопрос в том, есть ли способ создать или, если оно уже существует, поле, которое при условии int (10) егосохраняет значение как int, а при наличии десятичного числа (10,5) сохраняет его как десятичное?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

TBH для поля размера обуви. Я бы, вероятно, использовал атрибут CharField с выбором - существует относительно небольшое количество допустимых размеров обуви, и таким образом вы можете отформатировать их так, как хотите.

Если это часть модели Product, которая может содержать вещи, отличные от обуви, CharField для «size» полезен, поскольку вы также можете хранить значения, такие как «M», «L», «XXL» и т. Д.

Вам не нужно делать какие-либо вычисления для размеров обуви, поэтому нет смысла использовать DecimalField.

По этой причине на самом деле не имеет значения, что сохраняется в БД, только то, что вы отображаете, и у @j_syk было несколько хороших альтернативных предложений в том же духе в комментариях.

2 голосов
/ 25 октября 2011

Вам не помогает просто приведение к строке?Вы можете оставить свое хранилище как есть, но при представлении данных отформатируйте номер по своему вкусу.

>>> str(Decimal(10))
'10'
>>> str(Decimal(10.5))
'10.5'
>>> str(Decimal(10.0))
'10'
1 голос
/ 25 ноября 2011

Я принял это решение:

  1. Создание настраиваемого поля модели Django
  2. , которое возвращает настраиваемый экземпляр decimal.Decimal, реализующий трюк в __unicode__ потому что это просто вопрос представления

Вот фрагмент:

class PyPrettyDecimal(decimal.Decimal): 

    def __unicode__(self): 
        # TODO: to improve with decimal properties ?!? 
        mod = self - int(self) 
        if not mod: 
            rv = int(self) 
        else: 
            rv = self.quantize(mod.normalize()) 
        return unicode(rv) 

class PrettyDecimalField(models.DecimalField): 

    __metaclass__ = models.SubfieldBase 

    def to_python(self, value): 
        if value is None: 
            return value 
        try: 
            return PyPrettyDecimal(value) 
        except decimal.InvalidOperation: 
            raise exceptions.ValidationError(self.error_messages['invalid']) 
...