У меня вопрос, связанный с SQL / ORM, есть одна модель NewsArticle с ~ 500k объектами - запросы к ней вызывают некоторые проблемы с производительностью. Модель более или менее выглядит следующим образом:
Class NewsArticle(models.Model):
date_published = models.DateTimeField()
duplicates_group_id = models.UUIDField(blank=False, null=True)
duplicates = models.ManyToManyField('self', blank=True)
topic = models.ForeignKey('NewsTopic', on_delete=models.SET_NULL, null=True)
online = models.BooleanField(default=True)
...
Мне нужно сгруппировать по duplicates_group_id и выполнять итерации только для статей с наименьшим идентификатором из каждой совпадающей группы duplcates_group. В SQL следующий запрос выполняется довольно быстро (используются правильные индексы БД):
SELECT
l.`*` # fields dont matter now
FROM `summarizer_newsarticle` l
INNER JOIN
(SELECT MIN(id) AS first_article_id
FROM `summarizer_newsarticle`
WHERE date_published >= '2019-12-02 00:00:00'
GROUP BY duplicates_group_id) r
ON l.id = r.first_article_id
WHERE
l.`online` = 1 AND l.`topic_id` = 5
В View для отображения этих статей в методе get_queryset я изо всех сил пытаюсь подготовить правильный запрос. Также необработанный SQL не решил проблему, потому что get_queryset ожидает возврата объекта queryset. Без достаточных SQL запросов производительность действительно плохая. Может быть, у вас есть идея, возможно ли вообще воспроизвести такой запрос или сделать это по-другому? Спасибо