2009-11-18 126 views
17

我试图创建一个django数据库,记录我所有的漫画购买,我遇到了一些问题。我试图模拟漫画问题与处理它的艺术家之间的关系。与关系的其他数据的多对多关系

一个漫画的问题有一个或多个艺术家在这个问题上工作,一个艺术家将在多个单一问题上工作。此外,艺术家在漫画创作者(所有关于该问题的工作),作家(写作剧本),抽屉(绘制完整漫画),铅笔,油墨,颜色或文本等方面发挥作用。在某个角色中可能会有几位艺术家。

这给了我一个数据库模型,如: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()实例并显式搜索关系表来手动管理关系? NB。我正在使用Django 1.0,目前

回答

22

我建议您查看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

该链接正是我正在寻找和未找到。我想我需要看看我的搜索技能。 – 2009-11-19 09:43:00

+0

这是Django真正的'波涛汹涌的大海'。错误消息是误导性的,添加/创建方法确实应该按预期工作。谢谢发布这个答案。 – Rich 2011-02-16 11:43:02

+2

只是指出如果您使用create()方法,则不需要a.save()。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create – 2012-09-27 06:48:48

相关问题