2012-05-10 7 views
36

Django 모델에 부동 소수점 데이터를 저장하고 있으며 특정 값 범위 만 의미가 있습니다. 따라서 모델과 SQL 제약 수준 모두에서 이러한 제한을 부과하고 싶습니다.최대 및 최소 한도로 Django FloatField를 만드는 방법은 무엇입니까?

예를 들어, 나는 같은 것을 할 싶습니다

class Foo(Model): 
    myfloat = FloatField(min=0.0, max=1.0) 

내가 모델 수준의 양식이 아닌 수준에서이 작업을 수행 할 수. 사실, 나는 폼 레벨이 다른 범위를 가지기를 원할지도 모른다. 예를 들어 양식 수준에서 백분율 [0,100]을 사용하지만 모델에서 [0,1]로 변환합니다.

가능한가요, 그렇다면 어떻게해야합니까?

답변

11

당신이 폼 수준에서 제약 조건이 필요한 경우는 min_value 전달할 수 max_valueform field에 : 당신이 수준을 모델링을 이동해야하는 경우

myfloat = forms.FloatField(min_value=0.0, max_value=1.0) 

하지만 당신은 기본을 models.FloatField 클래스를 확장해야

class MinMaxFloat(models.FloatField): 
    def __init__(self, min_value=None, max_value=None, *args, **kwargs): 
     self.min_value, self.max_value = min_value, max_value 
     super(MinMaxFloat, self).__init__(*args, **kwargs) 

    def formfield(self, **kwargs): 
     defaults = {'min_value': self.min_value, 'max_value' : self.max_value} 
     defaults.update(kwargs) 
     return super(MinMaxFloat, self).formfield(**defaults) 

다음 모델에서 사용할 수 있습니다

class Foo(models.Model): 
    myfloat = MinMaxFloat(min_value=0.0, max_value=1.0) 
+0

확인. 그런 다음 MinMaxFloat를 확장하여 실제로 이러한 값에 대해 유효성을 검사하고 데이터베이스 제약 조건을 만들면 나에게 달려 있습니까? – Reid

+0

django 모델 수준에서 제약 조건을 만듭니다. 즉'Foo (myfloat = -1.0) .save()'와 같이 수동으로 레코드를 삽입 할 수 있지만'Foo' 모델을 기반으로'ModelForm'을 보내려고하면 ValidationError가 발생합니다 – San4ez

71

지금까지의 답변은 양식의 유효성을 검사하는 방법을 설명합니다. 또한 모델에 유효성 검사기를 넣을 수도 있습니다. MinValueValidatorMaxValueValidator을 사용하십시오. 예를 들어

:

from django.core.validators import MaxValueValidator, MinValueValidator 

... 
weight = models.FloatField(
    validators = [MinValueValidator(0.9), MaxValueValidator(58)]) 

나는 그, 상점을 SQL 제약 조건을 추가 생각하지 않습니다.

관련 문제