2010-02-04 16 views
5

मैं प्राथमिक श्रेणी और उप श्रेणियों के लिए माता पिता/बच्चे स्वयं संबंध के साथ एक श्रेणी मॉडल है:Django में कई रिलेशनशिप जहाजों पर कई() का उपयोग करते समय सत्यापन कैसे करें?

class Place(models.Model): 
    name = models.CharField(_("name"), max_length=100) 
    categories = models.ManyToManyField("Category", verbose_name=_("categories")) 

class Category(models.Model): 
    name = models.CharField(_("name"), max_length=100) 
    parent = models.ForeignKey('self', blank=True, null=True, related_name='child_set') 

मैं, अनाथ को रोकने के लिए (व्यवस्थापक वेब अंतरफलक में) त्रुटियों के इस प्रकार को रोकने के लिए

c_parent = Category(name='Restaurant') 
c_parent.save() 

c_child = Category(name="Japanese restaurant", parent=c_parent) 
c_child.save() 

place1 = Place (name="Planet sushi") 
place1.save() 
place1.categories.add(c_parent) 
place1.categories.add(c_child) 
की जरूरत

तो अब हम एक नया "ग्रह सुशी" कहा जाता है जहाँ है, यह एक रेस्तरां (जड़ श्रेणी), और एक जापानी रेस्तरां (उप श्रेणी)

है, लेकिन मैं चीजों को इस तरह का रोकने के लिए चाहते हैं:

place2 = Place (name="Tokyofood") 
place2.save() 

place2.categories.add(c_child) 

क्योंकि माता पिता सेट नहीं है, या सही जनक श्रेणी

जहां मैं व्यवस्थापक के लिए फ़ॉर्म सत्यापन नहीं कर सकते? और अन्य रूपों (किसी भी उपयोगकर्ता एक नई जगह में जोड़ सकते हैं और सही श्रेणियां चयन करना होगा क्योंकि)

+0

मैंने अपनी टिप्पणी –

उत्तर

1

अद्यतन: अब

def add_cat(self,cat): 
    self.categories.add(cat) 
    if cat.parent: 
     self.add_cat(cat.parent) 

बजाय place1.categories.add(cat) का उपयोग करने का:

प्लेस कक्षा में इस विधि को जोड़ने आप place1.add_cat(cat) का उपयोग कर सकते हैं और यह स्वचालित रूप से श्रेणी, और इसकी मूल श्रेणी, और इसकी मूल श्रेणी और अन्य जोड़ देगा। यह परीक्षण नहीं किया जाता है, लेकिन अगर यह काम नहीं करता है तो भी इसे बिंदु प्राप्त करना चाहिए।

+0

पर आधारित अपना उत्तर अपडेट किया है, इसलिए जब कोई नई श्रेणी (या उप बिल्ली) जोड़ते हैं तो हमें प्लेस.save() को फिर से चलाने की आवश्यकता होती है, और यदि माता-पिता को निर्दिष्ट नहीं किया गया है तो उसे जोड़ें , क्यों नहीं .. मेरे लिए पूरी तरह से साफ नहीं दिख रहा है लेकिन मदद कर सकता है। मैं श्रेणी मॉडल में कुछ करने की तलाश में था, शायद यह क्लीनर है? – Julien

+0

ओह दुह। मैं केवल एक जगह संपादित करने और श्रेणियों का चयन करने के बारे में सोच रहा था, फिर जगह को बचा रहा था। यदि आपके पास कोई ऐसा फॉर्म है जो किसी स्थान पर केवल नई श्रेणियां जोड़ता है, तो यह स्थान ऑब्जेक्ट की सहेजने वाली विधि को नहीं दबाएगा। –

6

signals और अधिक विशेष रूप से m2m_changed सिग्नल का उपयोग करें।

डॉक्टर को पढ़ने के लिए समय निकालें क्योंकि सिग्नल प्राप्त करना आसान नहीं है, और m2m_changed सबसे जटिल है क्योंकि यह एम 2 एम रिलेशनशिप में शामिल होने वाली हर चीज़ के लिए एक सिग्नल है।

मूल रूप से आप यह जांचना चाहते हैं कि कार्रवाई pre_add है, तो श्रेणी अभिभावक आपकी आवश्यकताओं से मेल नहीं खाता है तो सत्यापन प्रमाणीकरण बढ़ाएं।

sender और instance की जांच करने पर कुछ समय दें, espacially क्योंकि यह reverse के मान के अनुसार बदलता है।

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