Упрощение аннотации запросов в 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% верно... .

Если у кого-то есть другой подход, я буду рад его услышать.

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