У меня две модели. Одна модель - это таблица «Пользователи», которая содержит такие поля, как id, username, email, и у меня есть еще одна таблица, которая используется для отображения отношений «последователь» и «следующий». Показана следующая модель:
class Following(models.Model):
target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE, null=True)
def __str__(self):
return '{} is followed by {}'.format(self.target, self.follower)
Я сделал это исходя из предположения, что отношения между пользователями и подписками являются отношениями «один ко многим» (у одного пользователя может быть много подписчиков, и он может также подписываться на многих). Это правильно? Или это должны быть отношения «многие ко многим». Если да, то почему? Я видел много примеров того, как эта схема таблицы была как многие ко многим, так и один ко многим.
Класс пользователя:
class User(AbstractBaseUser):
username = models.CharField(max_length=15, unique=True)
email = models.EmailField(max_length=100, unique=True)
date_joined = models.DateTimeField(auto_now_add=True,
null=True)
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
@Brian Я обновил вопрос с помощью класса User. Я думаю, что у пользователя есть отношения "один ко многим" с таблицей подписчиков.






Использование предикатов [px] и ограничений [cx.y].
[p1] Пользователь (UserID) существует.
[c1.1] Пользователь идентифицируется идентификатором пользователя.
user {UserID} -- p1
KEY {UserID} -- c1.1
[p2] Последователь (FollowerID) следует за автором (AuthorID).
[c2.1] Последователь - это пользователь.
[c2.2] Автор - пользователь.
[c2.3] Для каждого подписчика, этот подписчик может подписаться на более чем одного автора.
[c2.4] Для каждого автора, за этим автором может следовать более одного последователя.
[c2.5] Для каждой комбинации автора и последователя эта комбинация этого автора и этого последователя может встречаться не более одного раза.
[c2.6] Авторы не могут следить за собой.
following {AuthorID, FollowerID} -- p2
KEY {AuthorID, FollowerID} -- c2.5, c2.3, c2.4
FOREIGN KEY {FollowerID} REFERENCES user {UserID} -- c2.1
FOREIGN KEY {AuthorID} REFERENCES user {UserID} -- c2.2
CHECK AuthorID != FollowerID -- c2.6
Итог, многие-ко-многим. Вы всегда можете настроить это, чтобы отразить ваши конкретные потребности, сосредоточившись на концептуальном / логическом дизайне, выраженном на естественном языке - предикатах и ограничениях.
Хм, я вижу, внутри таблицы есть отношения "многие ко многим". Какая польза от поля, имеющего отношение "многие ко многим"?
@ user2896120 это просто следствие логической модели, см. c2.3 и 2.4.
Так это больше о логике, чем о пользе?
@ user2896120 ну да - "отношение" - это модельная речь (OO, ERD); логика здесь суть.
Вам необходимо предоставить более подробную информацию о потребностях вашего конкретного приложения. В нынешнем виде я не знаю, может ли кто-нибудь сказать, основываясь на информации здесь, являются ли «Пользователи» и «Подписчики» «один ко многим» или «многие ко многим».