我正在尝试创建一个记录我所有漫画购买的django数据库,并且遇到了一些问题。我试图模拟一个漫画问题与从事它的艺术家之间的关系。
一个漫画问题有一个或多个艺术家正在研究这个问题,一个艺术家将处理一个以上的问题。此外,艺术家的角色与他们在漫画创作者(在该问题上的所有工作),作家(写剧本),抽屉(绘制完整的漫画),铅笔,墨水,颜色或文字,并且可能有几位艺术家担任某个角色。
这为我提供了一个数据库模型:
然后我将其转换为以下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
答案 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)