2012-05-10 11 views
36

मैं अपने Django मॉडल में कुछ फ़्लोटिंग-पॉइंट डेटा संग्रहीत कर रहा हूं, और केवल मूल्यों की एक निश्चित श्रृंखला सार्थक है। इसलिए, मैं इन सीमाओं को मॉडल और एसक्यूएल बाधा स्तर दोनों पर लगा देना चाहता हूं।अधिकतम और न्यूनतम सीमा के साथ 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' भेजने का प्रयास करते समय आपको प्रमाणीकरण त्रुटि मिल जाएगी – San4ez

71

उत्तर अब तक बताते हैं कि फॉर्म कैसे मान्य करें। आप मॉडल में वैधकर्ता भी डाल सकते हैं। MinValueValidator और MaxValueValidator का उपयोग करें।

उदाहरण के लिए:

from django.core.validators import MaxValueValidator, MinValueValidator 

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

मुझे नहीं लगता कि एसक्यूएल की कमी कहते हैं, यद्यपि है।

संबंधित मुद्दे