Сокращение запросов к базе данных при рендеринге тега включения
У меня есть модель, которая представляет твиты в моем приложении, и представление, которое возвращает 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, но не нашел правильного способа решить это.