2011-02-15 10 views
7

प्रिय लोगों के माध्यम से जा के Django ORM तरह से,दूसरों की मदद करने की कोशिश कर कई कई-से-अनेक संबंध

मैं यह पता लगाने की कैसे Django एक कस्टम एसक्यूएल लेखन के बिना मेरे लिए शामिल हो करने के लिए प्राप्त करने की कोशिश कर रहा हूँ।

चलो कहते हैं कि मैं निम्नलिखित मॉडल

class Parent(models.Model): 
    name = models.CharField() 
    children = models.ManyToManyField(Child, through="Parent_Child", related_name="parents") 

class Parent_Child(models.Model): 
    parent = models.ForeignKey(Parent, related_name='attached_children') 
    child = models.ForeignKey(Child, related_name='attached_parents') 

class Child(models.Model): 
    name = models.CharField() 
    toys = models.ManyToManyField(Toy, hrough="Child_Toy", related_name="toy_owners") 

class Child_Toy(models.Model): 
    child = models.ForeignKey(Child, related_name='attached_toys') 
    toy = models.ForeignKey(Toy, related_name='toy_owner') 

class Toy(models.Model): 
    name = models.CharField 

का जनक कई बच्चे हैं कर सकते हैं। एक बच्चे के कई माता-पिता हो सकते हैं। एक बच्चे को कई खिलौने मिल सकते हैं। खिलौने कई बच्चों के स्वामित्व में हो सकता है।

मैं माता-पिता के बच्चों के स्वामित्व वाले सभी खिलौनों की एक सूची प्राप्त करना चाहता हूं। AttributeError: 'ManyRelatedManager' object has no attribute 'toys': parent.children.all() और child.toys.all()

मुझे क्या करना चाहते हैं parent.children.toys.all() की तरह कुछ है जब मैं यह करने के लिए मैं कोशिश:

तो, मैं जैसे काम कर सकें। मैं त्रुटि समझता हूं - parent.children एकाधिक रिकॉर्ड देता है। यह उम्मीद है। मैं यह नहीं समझ सकता कि Django को संकेत देने के लिए कि मैं इसे अपनी क्वेरी में अतिरिक्त जोड़ना चाहता हूं।

क्या ऐसा कोई तरीका है जो मैं Django के भीतर शामिल हो सकता हूं या ऐसा करने के लिए मुझे कस्टम एसक्यूएल पर जाने की आवश्यकता है?

कृपया ध्यान दें: उपर्युक्त सिर्फ मेरी समस्या को स्पष्ट करने के लिए है, वास्तविक मॉडल जो मैं उपयोग कर रहा हूं वह प्रासंगिक नहीं हैं। मेरी समस्या वास्तव में एसक्यूएल का सहारा लेने के बिना Django में कई एम 2 एम संबंधों के माध्यम से शामिल होने का तरीका जानने का प्रयास कर रही है।

मैं आपकी मदद की अग्रिम में सराहना करता हूं। धन्यवाद!

+2

मैं एक नया उत्तर लिखें नहीं करना चाहते, लेकिन डॉक्स के लिए एक लिंक जोड़ना होगा: http : ddango जॉइन पर जानकारी के लिए //docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships विशेष रूप से यह सीखने में मददगार होगा कि फ़िल्टरिंग() आपके एम 2 एम क्वेरी –

उत्तर

7

, बस की तरह कुछ लिखें:

Toy.objects.filter(toy_owners__parents=parent) 
+0

को कैसे प्रभावित करता है_owners और __parents मतलब है? –

2

आप मध्यवर्ती तालिकाओं Parent_Child और Child_Toy तुम सिर्फ उन्हें बाहर छोड़ सकते हैं में अतिरिक्त जानकारी एकत्र नहीं करते हैं - Django आप के लिए स्वचालित रूप से उन्हें बना देगी। तो एक सरल सेटअप इस प्रकार दिखाई देगा:

class Parent(models.Model): 
    name = models.CharField(max_length=80) 
    children = models.ManyToManyField('Child', related_name="parent") 

class Child(models.Model): 
    name = models.CharField(max_length=80) 
    toys = models.ManyToManyField('Toy', related_name="owner") 

class Toy(models.Model): 
    name = models.CharField(max_length=80) 

आप field lookups का उपयोग करके एक विशिष्ट माता-पिता के लिए खिलौने क्वेरी कर सकते हैं।

Toy.objects.filter(owner__parent__id=1) 

या:

Toy.objects.filter(owner__parent=parent) 

resulting SQL इस तरह दिखता है:

SELECT "toy"."id", "toy"."name" FROM "toy" 
    INNER JOIN "child_toys" 
     ON ("toy"."id" = "child_toys"."toy_id") 
    INNER JOIN "child" 
     ON ("child_toys"."child_id" = "child"."id") 
    INNER JOIN "parent_children" 
     ON ("child"."id" = "parent_children"."child_id") 
    WHERE "parent_children"."parent_id" = 1 
संबंधित मुद्दे