2011-11-02 14 views
30

मैं एक ManyToManyField इस एक के लिए इसी तरह के साथ एक मॉडल (मॉडल पद एक भाषा है, भी) है:Django ManyToMany मॉडल सत्यापन

class Sentence(models.Model): 
    words = models.ManyToManyField(Word) 
    language = models.ForeignKey(Language) 
    def clean(self): 
     for word in self.words.all(): 
      if word.language_id != self.language_id: 
       raise ValidationError('One of the words has a false language') 

जब एक नया वाक्य जोड़ने की कोशिश कर (जैसे Django व्यवस्थापक के माध्यम से) मैं 'Sentence' instance needs to have a primary key value before a many-to-many relationship can be used प्राप्त करें। इसका मतलब है कि मैं इसे सहेजने से पहले self.words तक नहीं पहुंच सकता, लेकिन यह वही है जो मैं करने की कोशिश कर रहा हूं। क्या इसके आसपास काम करने का कोई तरीका है ताकि आप इस मॉडल को फिर भी मान्य कर सकें? मैं वास्तव में मॉडल के फ़ील्ड को सीधे सत्यापित करना चाहता हूं।

मुझे इस अपवाद से संबंधित कई प्रश्न मिले, लेकिन मुझे मेरी समस्या के लिए सहायता नहीं मिली। हम किसी भी सुझाव की सराहना करेंगे!

+0

यदि आप कोई शब्द बनाना चाहते हैं, तो आप यह कैसे मान्य करेंगे कि यह वाक्य के साथ जुड़ा हुआ था? इसकी मॉडल परिभाषा में 'वाक्य' फ़ील्ड नहीं है। – johnklawlor

+0

हर कोई फॉर्म का उपयोग नहीं करता है। मैं Django में यह एक भारी दोष मानते हैं। क्या किसी के पास बेहतर जवाब है? –

उत्तर

44

मॉडल की clean विधि में यह सत्यापन करना संभव नहीं है, लेकिन आप एक मॉडल फॉर्म बना सकते हैं जो words की पसंद को मान्य कर सकता है।

from django import forms 

class SentenceForm(forms.ModelForm): 
    class Meta: 
     model = Sentence 

    def clean(self): 
     """ 
     Checks that all the words belong to the sentence's language. 
     """ 
     words = self.cleaned_data.get('words') 
     language = self.cleaned_data.get('language') 
     if language and words: 
      # only check the words if the language is valid 
      for word in words: 
       if words.language != language: 
        raise ValidationError("The word %s has a different language" % word) 
     return self.cleaned_data 

फिर आप Django व्यवस्थापक में अपने फार्म का उपयोग करने के लिए अपने Sentence मॉडल व्यवस्थापक वर्ग अनुकूलित कर सकते हैं,।

class SentenceAdmin(admin.ModelAdmin): 
    form = SentenceForm 

admin.register(Sentence, SentenceAdmin) 
+6

यह देखने के लिए खेदजनक है कि मॉडल में सीधे इसे सत्यापित करने की कोई संभावना नहीं है। लेकिन अब तक एक कस्टम मॉडलफॉर्म मेरे लिए पर्याप्त है। आपके उत्तर के लिए धन्यवाद! – purefanatic

+0

इसके अलावा, यदि आपका वाक्य फ़ॉर्म किसी अन्य मॉडल (उदाहरण के लिए एक पैराग्राफ) में एक इनलाइन के रूप में भी देखा जा सकता है, तो आप वाक्य 'फॉर्म = वाक्यफॉर्म' को वाक्य भी इनलाइन श्रेणी में जोड़ना चाहेंगे। –

+0

@purefanatic 'Model.save()' को 'सत्यापन प्रमाणीकरण' बढ़ाने की उम्मीद नहीं है, इस प्रकार इसे सीधे सत्यापित करने का कोई तरीका नहीं है। – jnns

1

आप इसे मॉडल पर clean विधि से नहीं कर सकते हैं। डीजेंगो में एम 2 एम संबंधों के तरीके के साथ यह संभव नहीं है। हालांकि, आप Sentence जैसे व्यवस्थापक या अपनी साइट पर एक फॉर्म बनाने के लिए प्रयुक्त रूपों पर इस तरह के सत्यापन कर सकते हैं।

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