Отношения многие ко многим в Джанго - PullRequest
0 голосов
/ 11 мая 2011

Я работаю над дизайном для некоторых моделей в Джанго и хотел бы получить совет.У меня есть модель для команд, в которую могут войти многие пользователи.Пользователи также могут быть членами многих команд, но они не могут быть членами одной команды дважды.Есть также отдельная информация, которую я хочу отслеживать для каждой команды / пользователя.Кроме того, будет пользователь, который является «администратором» для каждой команды, но у каждой команды может быть только один администратор.У меня есть несколько кратких определений модели данных следующим образом:

class Team(models.Model):
    name = models.CharField()
    members = models.ManyToManyField(User, through='Membership')
    admin = models.ForeignKey(User)

class Membership(models.Model):
    user = models.ForeignKey(User)
    team = models.ForeignKey(Team)
    extra_data = models.CharField()

Итак, я предполагаю, что у меня есть два вопроса:

1) как мне сделать так, чтобы в модели членства не было пользователя иКомбинация команд появлялась несколько раз?

2) Есть ли лучший способ обозначить администратора в команде, убедившись, что в каждой команде был только один?Похоже, что если я сохраняю администратора таким образом, при соблюдении правила о наличии только одного администратора, становится слишком громоздким, чтобы запрашивать всех членов команды, так как администратор не будет в таблице Членства.И если они хранятся в членстве, то мне придется выполнить другой запрос, чтобы увидеть, являются ли они администратором этой команды или нет.Мысль об использовании поля is_admin в Membership возникла у меня в голове, но я не уверен, как сохранить ограничения 1 администратор на команду.

Любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ: похоже, что метатег unique_together - это то, что я ищу в первом вопросе.Мне все еще интересно второе ... .... 1012 *

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Первый вопрос:

Вы можете добавить ограничение, чтобы предотвратить его:

class Membership(models.Model):
    user = models.ForeignKey(User)
    team = models.ForeignKey(Team)
    extra_data = models.CharField()
    class Meta:
        unique_together = (('user','team'),)

Второй вопрос (ы):

Вы можете добавить поле ранжирования кмодель членства и сделайте «user» и «rank» уникальным целым, положительным целочисленным полем.И пользователь с rank == 1 является администратором.Или похожие.Он будет обеспечивать выполнение вашей схемы, но может быть громоздким, чтобы кодировать его содержание.Возможно, вам будет лучше с тем, что у вас есть.

0 голосов
/ 11 мая 2011

В ответ на ваш второй вопрос:

Почему бы вам не включить администратора в членов команды m2m?

Если вам нужна вся команда, включая администратора:

some_team.members

Сохранение админ-фк на модели команды имеет смысл, когда вы хотите использовать админа, вы можете использовать:

some_team.admin 

и когда вы хотите команду без администратора, вы можете использовать:

some_team.members.exclude(pk = some_team.admin.pk)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...