Django queryset статей авторов, за которыми следит пользователь - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две модели

class Account(AbstractBaseUser, PermissionsMixin):
    followers = models.ManyToManyField(
        'Account', related_name='followers',
        blank=True,
    )
    following = models.ManyToManyField(
        'Account', related_name='following',
        blank=True,
    )

и

class Article(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
    )

Я пишу приложение, в котором пользователи подписываются друг на друга и создают статьи.

Как можноЯ делаю запрос на получение всех статей от тех, на кого я подписан?Я пытаюсь сделать что-то вроде: (псевдокод)

user = self.get_object()
articles = Article.objects.filter(author=user.followers.all())

Но я знаю, что это не так

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вам не нужно два поля многие-ко-многим.

Например, вы можете удалить поле followers многие-ко-многим, а затем получить подписчиков для учетной записи, используя обратнуюотношение поля following.

class Account(AbstractBaseUser, PermissionsMixin):
    following = models.ManyToManyField(
        'Account', 
        related_name='followers',
        blank=True,
    )

Затем вы можете использовать запись двойного подчеркивания для фильтрации по полю «многие ко многим»:

articles = Article.objects.filter(author__followers=user)
0 голосов
/ 23 мая 2018

Возможно, вы захотите разделить подписчиков и следующие поля на два класса.(PseudoCode)

class Following():
    author_id = models.foreignkey('Author')
    following_authors = models.integerfield('Following_Authors')

Цикл всех авторов, на которых вы подписаны, и добавление в список.Конечно, в ваших статьях должно быть поле для статьи, в котором размещены статьи.

AuthorOfArticle = Author.objects.get(author='author to get all following')

FollowingAuthorsObj = Following.objects.filter(author=AuthorOfArticle.author) #get all the authors you are following.

ArticlesOfAuthor=[] #create a list variable
for authors in FollowingAuthorsObj: #loop through all you are following
    ArticlesOfAuthor.append(Article.objects.filter(author=authors[0].author)) 
#save it to a list of all articles.

Надеюсь, это поможет.

0 голосов
/ 23 мая 2018

Сначала вы можете получить список следующих, а затем отфильтровать статьи на основе этого списка, используя __in:

user = self.get_object()
following = user.following.values_list('id', flat=True)
articles = Article.objects.filter(author_id__in=following)
...