2009-11-18 17 views
17

मैं एक डीजेंगो डेटाबेस बनाने की कोशिश कर रहा हूं जो मेरी सभी कॉमिक खरीद रिकॉर्ड करता है, और मैंने कुछ समस्याएं निभाई हैं। मैं एक कॉमिक मुद्दे और कलाकारों के बीच संबंधों को मॉडल करने की कोशिश कर रहा हूं।रिश्तों पर अतिरिक्त डेटा के साथ कई रिश्तों के लिए कई

एक कॉमिक मुद्दे में इस मुद्दे पर काम कर रहे एक या अधिक कलाकार हैं, और एक कलाकार एक से अधिक मुद्दों पर काम करेगा। इसके अलावा, कलाकार के कॉमिक निर्माता (उस मुद्दे पर सभी काम), लेखक (स्क्रिप्ट लिखे गए), दराज (पूर्ण कॉमिक खींचा), पेंसिल, स्याही, रंग या पाठ पर किए गए कार्यों से संबंधित एक भूमिका है, और किसी भी भूमिका में कई कलाकार हो सकते हैं।

यह मेरे जैसे एक डेटाबेस मॉडल देता है: Database model

मैं उसके बाद निम्न Django मॉडल में इस अनुवाद करते हैं। मैं रिश्ते पर अतिरिक्त डेटा की आवश्यकता होती है के रूप में, मेरा मानना ​​है कि मैं रिश्ते को संभालने के लिए एक अलग वर्ग का उपयोग करने के लिए, और पकड़ अतिरिक्त

class Artist(models.Model): 
    name = models.CharField(max_length = 100) 

    def __unicode__(self): 
     return self.name 

class ComicIssue(models.Model): 
    issue_number = models.IntegerField() 
    title = models.TextField() 
    artists = models.ManyToManyField(Artist, through='IssueArtist') 

    def __unicode__(self): 
     return u'issue = %s, %s' % (self.issue_number, self.title) 

class IssueArtist(models.Model): 
    roles = ((0, "--------"), 
       (1, "Creator"), 
       (2, "Writer"), 
       (3, "Drawer"), 
       (4, "Pencils"), 
       (5, "Inks"), 
       (6, "Colours"), 
       (7, "Text"), 
      ) 
    artist = models.ForeignKey(Artist) 
    issue = models.ForeignKey(ComicIssue) 
    role = models.IntegerField(choices = roles) 

मेरे सवाल कर रहे हैं है:

1) यह एक सही प्रतीत होता है इसे मॉडलिंग का तरीका?

2) यदि मैं through='IssueArtist' सुविधा का उपयोग नहीं करता, तो मैं artists.add() फ़ंक्शन का उपयोग करके संबंध जोड़ सकता हूं। अगर मैं इसका उपयोग करता हूं, तो मुझे 'ManyRelatedManager' object has no attribute 'add' त्रुटि मिलती है। क्या मुझे IssueArtist() उदाहरण बनाकर रिश्ते को मैन्युअल रूप से प्रबंधित करना है, और स्पष्ट रूप से रिलेशनशिप टेबल खोजना है? एनबी। मैं

उत्तर

22

पर Django 1.0 का उपयोग कर रहा हूं, मैं आपको Django documentation में "कई से अधिक संबंधों पर अतिरिक्त फ़ील्ड" अनुभाग की जांच करने की सलाह देता हूं - यह वास्तव में आपके प्रश्न को शामिल करता है।

1: हाँ, एक मध्यस्थ मॉडल बनाना जाने का तरीका है।

2: प्रलेखन से: "सामान्य से कई क्षेत्रों के विपरीत, आप संबंध बनाने के लिए जोड़, निर्माण या असाइनमेंट का उपयोग नहीं कर सकते हैं" - इसके बजाय, किसी समस्या को कलाकार जोड़ने के लिए, इसे मध्यस्थ से करें मॉडल:

some_artist = Artist.objects.get(name='some name') 
some_issue = Issue.objects.get(tile='some tite') 
IssueArtist.objects.create(artist= some_artist, issue = some_issue, role=1) 
+0

यह लिंक ठीक वही है जो मैं ढूंढ रहा था और खोजने में विफल रहा था। मुझे लगता है कि मुझे अपने खोज कौशल को देखने की ज़रूरत है। –

+0

यह Django का असली 'मोटा समुद्र' हिस्सा है। त्रुटि संदेश भ्रामक है और ऐड/निर्माण विधियों को वास्तव में अपेक्षित कार्य करना चाहिए। इस उत्तर को पोस्ट करने के लिए धन्यवाद। – Rich

+2

बस यह इंगित करते हुए कि a.save() अनावश्यक है यदि आप create() विधि का उपयोग कर रहे हैं। https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create –

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