Как использовать ManyToManyField для собственного класса
У меня есть одна модель в файле models.py с именем Account
.
В этом случае я хочу создать поле, в котором я могу выбирать свои собственные объекты модели.
Например, если у меня есть 3 счета {Jack, Harry, Helena}
.
Я хочу выбрать между ними нужные мне счета. На самом деле я просто хочу создать Систему следования. Джек может следовать за Гарри и Хеленой; также Хелена может следовать за Джеком или Гарри
.
Как мне это сделать, ребята?
Account класс внутри models.py
class Account(models.Model):
username = models.CharField(max_length=100)
following = models.ManyToManyField(**Account**, blank=True)
Almost as in the title you used: use 'self'
. But there is a caveat: ManyToManyField
s that refer to themselves are by default symmetric: if A is following B, then B is automatically following A. Perhaps that is not what you inteded. In that case, set symmetrical=False
[Django-doc]:
class Account(models.Model):
username = models.CharField(max_length=100)
following = models.ManyToManyField(
'self', symmetrical=False, blank=True, related_name='followers'
)
Для создания следующей системы можно использовать поле ManyToManyField в Django. Это поле используется для создания отношений "многие-ко-многим", т.е. отношений, в которых объект может принадлежать нескольким категориям, а категория также будет иметь несколько объектов.
В модели аккаунта можно добавить поле с именем 'following' и установить его как ManyToManyField на 'self'. Это означает, что аккаунт может иметь множество других аккаунтов, связанных с ним, что соответствует аккаунтам, за которыми он следует.
Вот исправленная версия вашего кода:
class Account(models.Model):
username = models.CharField(max_length=100)
following = models.ManyToManyField('self', blank=True, symmetrical=False)
Аргумент 'symmetrical=False' используется здесь, чтобы указать, что если Джек следует за Гарри, это не обязательно означает, что Гарри следует за Джеком.
Затем вы можете добавлять или удалять учетные записи, используя метод add() или remove() для поля 'following'. Например, если вы хотите, чтобы Джек следовал за Гарри, вы можете сделать так:
jack = Account.objects.get(username='Jack')
harry = Account.objects.get(username='Harry')
jack.following.add(harry)
А если вы хотите, чтобы Джек отписался от Гарри, вы можете сделать так:
jack.following.remove(harry)