Шаг скрутки у меня есть вопрос об отношениях.
Я хочу Пользователям иметь Дружбу. Таким образом, Пользователь может быть другом с другим Пользователем. Я предполагаю, что должен буду использовать 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)
Спасибо
Поле "многие ко многим" описано в документации. Просто сделайте:
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
(см. справку по полю модель).