与关系的其他数据有很多关系

Sim*_*lan 17 django django-models

我正在尝试创建一个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)
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)这似乎是一种正确的建模方法吗?

2)如果我不使用该through='IssueArtist'功能,我可以使用该artists.add()功能添加关系.如果我使用它,我会收到错误'ManyRelatedManager' object has no attribute 'add'.我是否必须通过创建IssueArtist()实例并显式搜索关系表来手动管理关系?NB.我现在正在使用Django 1.0

Hof*_*off 22

我建议你查看Django文档中的"EXTRA FIELDS ON MANY-to-MANY RELATIONSHIPS"部分- 它完全涵盖了你的问题.

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)
Run Code Online (Sandbox Code Playgroud)

  • 只是指出如果你使用create()方法,则不需要a.save().https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create (2认同)