Сокращение запросов к базе данных при рендеринге тега включения

У меня есть модель, которая представляет твиты в моем приложении, и представление, которое возвращает queryset с ними.

class Tweet(MPTTModel):

    text = models.CharField(max_length=140, db_index=True)
    pub_date = models.DateTimeField(auto_now_add=True)
    likes = models.ManyToManyField(User, blank=True, related_name='liked_tweets', through='TweetLike')
    retweets = models.ManyToManyField(User, blank=True, 
related_name='retweeted_tweets', through='TweetRetweet')
    bookmarks = models.ManyToManyField(User, blank=True, 
related_name='bookmarked_tweets', through='TweetBookmark')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='tweets')
    parent = TreeForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, related_name='children')

Каждый твит отображается с тегом включения, который включает в себя другой тег включения. Этот тег отображает участников переписки над текстом твита, как в оригинальном твиттере.

@register.inclusion_tag('tweets/_reply_to_snippet.html')
def reply_to(tweet, current_user):
    # Finds all ancestors for each tweet in queryset and then tweet owners.
    tweets_ancestors = tweet.get_ancestors().exclude(user=tweet.user)
    users_ancestors = CustomUser.objects.filter(tweets__in=tweets_ancestors). \
                            distinct()
    return {
        'current_user': current_user,
        'tweet_id': str(tweet.id),
        'users': users_ancestors
    }

И этот тег обращается к базе данных с новым запросом для каждого твита. Я пытался поиграть с prefetch_related в представлении, но похоже это не решит мою проблему. Теперь у меня есть идея добавить еще один атрибут к просмотру qs с users_ancestors или их id, но не нашел правильного способа решить это.

Вернуться на верх