Много-много отношений с дополнительными данными об отношениях - PullRequest
17 голосов
/ 18 ноября 2009

Я пытаюсь создать базу данных django, которая записывает все мои покупки комиксов, и я столкнулся с несколькими проблемами. Я пытаюсь смоделировать отношения между комическим вопросом и художниками, которые над ним работают.

В комической проблеме один или несколько художников работают над этой проблемой, и один художник будет работать над несколькими проблемами. Кроме того, у художника есть роль, связанная с тем, что он сделал над создателем комиксов (все работы по этому вопросу), писателем (написал сценарий), выдвижным ящиком (нарисовал полный комикс), карандашами, чернилами, цветами или текстом, и может быть несколько художников в данной роли.

Это дает мне модель базы данных, такую ​​как: Database model

Затем я перевожу это в следующую модель Джанго. Поскольку мне требуются дополнительные данные об отношениях, я считаю, что мне нужно использовать отдельный класс для обработки отношений и удерживать дополнительные

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, на данный момент

1 Ответ

22 голосов
/ 18 ноября 2009

Я рекомендую вам ознакомиться с разделом «ДОПОЛНИТЕЛЬНЫЕ ОБЛАСТИ ОТНОШЕНИЙ ОТ МНОГООБРАЗОВАНИЯ» в документации Django - она ​​охватывает именно ваш вопрос.

1: да, создание промежуточной модели - это путь.

2: Из документации: «В отличие от обычных полей« многие ко многим », вы не можете использовать добавление, создание или назначение для создания отношений» - вместо этого, для добавления Artist к проблеме, сделайте это из промежуточной модели :

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...