Django ManyToMany через помощь - PullRequest
       8

Django ManyToMany через помощь

6 голосов
/ 15 марта 2010

Хей, у меня вопрос об отношениях.

Я хочу, чтобы у пользователей была дружба. Таким образом, пользователь может быть другом другого пользователя. Я предполагаю, что мне нужно будет использовать ManyToManyField через таблицу дружбы. Но я не могу заставить его работать. Есть идеи?

Вот мои модели.

class User(models.Model):
    username = models.CharField(max_length=999)
    password = models.CharField(max_length=999)
    created_on = models.DateField(auto_now = False, auto_now_add = True)
    updated_on = models.DateField(auto_now = True, auto_now_add = False)
    friends = models.ManyToManyField('self')
    pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested')

class PendingFriendship(models.Model):
    user = models.ForeignKey('User', related_name='user')
    requested_friend = models.ForeignKey('User', related_name='requested_friend')
    created_on = models.DateField(auto_now = False, auto_now_add = True)
    updated_on = models.DateField(auto_now = True, auto_now_add = False)

Спасибо

Ответы [ 2 ]

6 голосов
/ 15 марта 2010

Поле «многие ко многим» описано в документации .Просто сделайте:

class User(models.Model):
    username = models.CharField(max_length=999)
    password = models.CharField(max_length=999)
    created_on = models.DateField(auto_now = False, auto_now_add = True)
    updated_on = models.DateField(auto_now = True, auto_now_add = False)
    friends = models.ManyToManyField('self')

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

Поскольку вы называете свою модель Пользователь , я предполагаю, что вы не используете встроенную среду аутентификации.Но если вы используете его, вам не нужно реализовывать аутентификацию самостоятельно, так что подумайте об этом.

Обновление: Читали ли вы разделы, на которые я ссылался?Там это описано:

Существует несколько ограничений на промежуточную модель:

  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ для целевой модели.(это будет Человек в нашем примере).Если у вас более одного внешнего ключа, возникнет ошибка проверки.
  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ к исходной модели (в нашем примере это будет группа).Если у вас более одного внешнего ключа, возникнет ошибка проверки.
  • Единственное исключение из этого - модель, которая имеет отношение «многие ко многим» к себе через посредническую модель.В этом случае допускается использование двух внешних ключей для одной и той же модели, но они будут рассматриваться как две (разные) стороны отношения «многие ко многим».
  • При определении «многие ко многим»-при многих отношениях от модели к себе, используя промежуточную модель, вы должны использовать symmetrical=False (см. справочник по полям модели ).
0 голосов
/ 03 августа 2012

Этот блог объясняет, что вам нужно. Из блога вы просто должны изменить related_name в этой строке:

pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested')

в

related_name='friend_requested+'

Однако я все еще не могу заставить его работать, создавая симметричные отношения автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...