django ManyToMany через справку

Шаг скрутки у меня есть вопрос об отношениях.

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

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

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)

Спасибо

6
задан dotty 15 March 2010 в 12:35
поделиться

1 ответ

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

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')

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

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

Update: Вы читали разделы, на которые я дал ссылку? Там описано:

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

  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ к целевой модели (в нашем примере это будет Person). Если у вас более одного внешнего ключа, будет выдана ошибка валидации.
  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ к исходной модели (в нашем примере это Group). Если у вас более одного внешнего ключа, будет выдана ошибка проверки.
  • Единственным исключением из этого правила является модель, которая имеет отношения "многие-ко-многим" к самой себе через промежуточную модель. В этом случае разрешается использовать два внешних ключа к одной модели, но они будут рассматриваться как две (разные) стороны отношения "многие-ко-многим".
  • При определении отношения "многие-ко-многим" от модели к самой себе, используя промежуточную модель, вы должны использовать symmetrical=False (см. справку по полю модель).
6
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: