2011-10-25 3 views
1

다른 정보와 함께 신발 크기를 기본적으로 저장하는 앱을 만들고 있습니다. Django Decimal 필드를 사용하여 크기를 저장했지만 10 진수 필드는 10.0과 같은 크기를 저장하므로 내 질문이 있습니다. 또는 이미 int (10)를 제공 할 때 이미 필드가있는 경우 만들 수있는 방법이 있습니까? 값을 int로 저장하고 십진수로 제공된 경우 (10.5) 10 진수로 저장합니까?django 스마트 십진수 필드

+0

실제로 DecimalField에 int 유형으로 저장하지 않습니다. 템플릿 태그 또는 모델 메서드를 작성하여 정수로 인쇄 된 십진수가없는 숫자를 출력 할 수 있습니다. –

+0

값을받은대로 저장해야하므로 걱정할 필요없이 데이터베이스에서 가져올 수 있습니다. .0 – Paulo

+1

에 대해 CharField를 사용하십시오. –

답변

3

TBH는 속성 - 유효 신발 크기의 수가 상대적으로 적은 당신이 그들을 포맷 할 수있는 방법은 당신이 원하는 방법에 대해 설명합니다. 이 신발 이외의 것들을 포함 할 수있는 제품 모델의 일부의 경우는 'M', 'L'등 'XXL'

같은 값을 저장할 수 있기 때문에

하는 CharField는 '크기'에 대한 유용

신발 크기에 대해 계산할 필요가 없으므로 DecimalField를 사용할 필요가 없습니다.

그런 이유로 DB에 저장되는 내용은 중요하지 않으며 표시되는 내용과 @j_syk에는 주석의 해당 행에 대한 몇 가지 좋은 대안이 있습니다.

나는이 솔루션을 채택
+0

'M', 'L'등이 좋은 점. 일부 신발은 슬리퍼와 샌들처럼 약간의 크기입니다. 저장되는 데이터가 신발에 관한 것인지 또는 사용자의 신발 크기에 해당하는지에 따라 달라질 수 있습니다 (즉, 내 신발 크기가 XL이라고 절대로 말하지 않습니다). –

+0

나는 선택과 함께 charfield를 사용하기로 선택했다, 나는 그것의 가장 쉬운 길을 지금 생각했다 :) – Paulo

2

단순히 문자열로 변환하여 캐스팅하지 않습니까? 스토리지를 그대로 유지할 수 있지만 데이터를 표시 할 때 원하는대로 번호의 형식을 지정하십시오. 아마 선택으로 CharField을 사용하십시오 신발 크기 필드에 대한

>>> str(Decimal(10)) 
'10' 
>>> str(Decimal(10.5)) 
'10.5' 
>>> str(Decimal(10.0)) 
'10' 
+0

나는 이것에 대해 생각 해본 적이 없다.이 기능을 추가하기 위해서는 커스텀 필드를 써야한다는 것을 의미하는 가장 좋은 방법이라고 생각 하나? – Paulo

+0

[CharField']를 [초기 값] (https://docs.djangoproject.com/en/dev/ref/forms/fields/#initial)과 함께 사용하여 원하는대로 표현할 수 있습니다. 문자열). 그것을 저장할 때,'Decimal' 클래스가 그것을 저장할 것이므로 걱정할 필요가 없습니다 : 그것은 잘 작동 할 것입니다. – jro

+0

그러나 소수점 클래스가 저장하면 .o?와 함께 저장됩니다. – Paulo

1

:

  1. 이 여기

는 표현의 문제이기 때문에 사용자 정의 __unicode__에 트릭을 구현하는 사용자 정의 decimal.Decimal 인스턴스를 반환 Django model Field

  • 만들기 스 니펫 :

    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'])