Упрощение аннотации запросов в Django
У меня 3 модели, и одна функция вызывается много раз, но она генерирует 200-300 sql-запросов, и я хотел бы уменьшить это число.
У меня следующая схема:
class Info(models.Model):
user = models.ForeignKey(User)
...
class Forum(models.Model):
info = models.ForeignKey(Info)
datum = models.DateTimeField()
...
class InfoViewed(models.Model):
user = models.ForeignKey(User)
infokom = models.ForeignKey(Info)
last_seen = models.DateTimeField()
...
. Мне нужно получить все количество новых сообщений на форуме, поэтому только число. На данный момент это работает так: я делаю итерации по всем связанным инфокомам и леттерирую все форумы, у которых дата выше, чем поле last_seen связанного InfoViewed.
Это работает, однако результат ~200 запросов для 100 инфо.
Есть ли возможность получить одно и то же число за несколько запросов? Я пытался играть с annonate и django.db.models.Count, но у меня ничего не получилось.
Django: 1.11.16
Спасибо.
Мне удалось придумать некоторое решение с другой точки зрения:
Forum.objects.filter(info_id__in=info_ids,
info__info_viewed__user=request.user,
datum__gt=F('info__info_viewed__last_seen')).count()
где info_ids - это id всех связанных инфов (список), однако я не уверен, что это решение на 100% верно... .
Если у кого-то есть другой подход, я буду рад его услышать.