Django ORM соединение на одном столе - PullRequest
0 голосов
/ 25 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...