Вам нужно только добавить поле m2m на SeriesText
. По сути, не имеет значения, к какой модели присоединено поле «многие ко многим» (база данных будет выглядеть так же, и доступ к данным будет аналогичным, если не идентичным). Исходя из моего опыта, лучше, если вам не придется возиться с моделью Django User:
class SeriesText(models.Model):
series_name = models.CharField(max_length=255)
series_text = models.CharField(max_length=255)
subscribers = models.ManyToManyField(User, related_name='subscriptions')
def __str__(self):
return self.series_name
Чтобы увидеть, как это работает, сначала добавьте некоторые данные:
s1 = SeriesText.objects.create(series_name='name1', series_text='text1')
s2 = SeriesText.objects.create(series_name='name2', series_text='text2')
u1 = User.objects.create_user('user1')
u2 = User.objects.create_user(username='user2')
u3 = User.objects.create_user(username='user3')
u4 = User.objects.create_user(username='user4')
u5 = User.objects.create_user(username='user5')
s1.subscribers.add(u1, u2, u3)
s2.subscribers.add(u3, u4, u5)
Затем, чтобы получить всех подписчиков для SeriesText (я получаю объекты из базы данных здесь, чтобы показать, что это не артефакт двух последних строк выше - данные были изменены в базе данных):
>>> SeriesText.objects.get(series_name='name1').subscribers.all()
[<User: user1>, <User: user2>, <User: user3>]
>>> SeriesText.objects.get(series_name='name2').subscribers.all()
[<User: user3>, <User: user4>, <User: user5>]
для получения всех подписок для пользователя (мы заявили, что отношение от User к SeriesText должно иметь имя subscriptions
в поле многие-ко-многим):
>>> User.objects.get(username='user1').subscriptions.all()
[<SeriesText: name1>]
>>> User.objects.get(username='user2').subscriptions.all()
[<SeriesText: name1>]
>>> User.objects.get(username='user3').subscriptions.all()
[<SeriesText: name1>, <SeriesText: name2>]
>>> User.objects.get(username='user4').subscriptions.all()
[<SeriesText: name2>]
>>> User.objects.get(username='user5').subscriptions.all()
[<SeriesText: name2>]
Если бы мы не ' t объявил related_name, нам пришлось бы использовать значение по умолчанию:
User.objects.get(username='user1').seriestext_set.all()
, которое также не читается.