मैं अभी भी मॉडल स्तर पर एक कस्टम सत्यापनकर्ता का उपयोग कर Django मॉडल ऑब्जेक्ट को सत्यापित करने के सही तरीके को समझने की कोशिश कर रहा हूं। मुझे पता है कि सत्यापन आमतौर पर एक रूप या मॉडल रूप में किया जाता है। हालांकि, मैं मॉडल स्तर पर अपने डेटा की अखंडता सुनिश्चित करना चाहता हूं यदि मैं पाइथन शेल में ओआरएम के माध्यम से इसके साथ बातचीत कर रहा हूं।Django मॉडल ऑब्जेक्ट्स को मान्य करने के लिए सही तरीका?
from django.db import models
from django.core import validators
from django.core exceptions import ValidationError
def validate_gender(value):
""" Custom validator """
if not value in ('m', 'f', 'M', 'F'):
raise ValidationError(u'%s is not a valid value for gender.' % value)
class Person(models.Model):
name = models.CharField(max_length=128)
age = models.IntegerField()
gender = models.CharField(maxlength=1, validators=[validate_gender])
def save(self, *args, **kwargs):
""" Override Person's save """
self.full_clean(exclude=None)
super(Person, self).save(*args, **kwargs)
यहाँ मेरी सवाल कर रहे हैं:
मैं एक कस्टम मान्यता समारोह बनाना चाहिए, एक सत्यापनकर्ता के रूप में यह निर्दिष्ट करते हैं, और उसके बाद व्यक्ति की सेव (ओवरराइड) समारोह के रूप में मैं यहाँ मेरी वर्तमान दृष्टिकोण है ऊपर किया है? (वैसे, मुझे पता है कि मैं 'विकल्प' फ़ील्ड विकल्प का उपयोग करके अपने लिंग विकल्पों को मान्य कर सकता हूं लेकिन मैंने चित्रण के उद्देश्य के लिए 'validate_gender' बनाया है)।
मैं वास्तव में अपने डेटा की अखंडता को सुनिश्चित करना चाहते हैं हैं, तो मैं केवल मॉडल परत पर परीक्षण के लिए Django इकाई परीक्षण लेकिन यह भी बराबर डेटाबेस स्तरीय इकाई परीक्षण अजगर/Psycopg का उपयोग कर लिख नहीं करना चाहिए? मैंने देखा है कि Django यूनिट परीक्षण, जो ValidationErrors को बढ़ाता है, डेटाबेस की एक प्रति का उपयोग कर डेटाबेस स्कीमा की मॉडल की समझ का परीक्षण करता है। यहां तक कि अगर मैं माइग्रेशन के लिए दक्षिण का उपयोग करना चाहता था, तो भी किसी भी डेटाबेस-स्तरीय बाधाओं को सीमित किया जाता है जो Django एक पोस्टग्रेस बाधा में समझ और अनुवाद कर सकता है। अगर मुझे एक कस्टम बाधा की आवश्यकता है जो Django दोहराना नहीं कर सकता है, तो संभवतः मैं अपने डेटाबेस में डेटा दर्ज कर सकता हूं जो उस बाधा का उल्लंघन करता है यदि मैं सीधे psql टर्मिनल के माध्यम से डेटाबेस के साथ बातचीत कर रहा हूं।
धन्यवाद!
मुझे यकीन नहीं है कि इस विषय पर आपके पिछले प्रश्नों के लिए प्रश्न 1 अलग कैसे है। ध्यान दें कि यह अभी भी ओआरएम का उपयोग करके अमान्य डेटा डालने से नहीं रोकता है। 'Person.objects.update (लिंग =' ए ') पर विचार करें। – Alasdair
आप सही हैं कि मेरे पिछले प्रश्न में मैंने एक कस्टम सत्यापनकर्ता फ़ंक्शन शामिल नहीं किया जैसा मैंने यहां किया था। .update के बारे में आपके अन्य अवलोकन के रूप में, मुझे लगता है कि अब मुझे एक अतिरिक्त समस्या है जो मेरे भ्रम में जोड़ती है।मैं वास्तव में यह समझने के लिए संघर्ष कर रहा हूं कि ऐसा करने का सही तरीका क्या है। जबकि Django दस्तावेज़ बहुत अच्छे हैं, आईएमएचओ, वे स्निपेट्स और "हैंड-वेविंग" पर लंबे समय तक हैं लेकिन पूर्ण उदाहरणों पर कम है जो इस समस्या को हल करने के लिए सही तरीके से समझने की तरह "newb" की मदद करेंगे। दुर्भाग्यवश, मैं अकेले काम करता हूं और इसके साथ चर्चा करने के लिए अधिक अनुभवी डेवलपर्स नहीं हैं। – William