Как заставить Django использовать «JOIN VALUES» - PullRequest
0 голосов
/ 18 сентября 2018

У меня проблема с производительностью, когда мне нужно заменить раздел моего запроса.Прямо сейчас у меня есть следующее:

select count(*) FROM "mytable" WHERE "field" IN ('v1', 'v2', ..., 'vN');

это можно перевести на Django ORM:

Mytable.objects.all().filter(field__in=[myvalues]).count()

Мне нужно сделать следующее:

select count(*) FROM "mytable" JOIN (values ('v1', 'v2', ..., 'vN')) as lookup(value) on lookup.value = "mytable".field;

Есть ли способ добавить это в ORM?Мне нужно сделать с ORM, потому что у меня уже есть другие фильтры.В худшем случае я подумал о том, чтобы получить строку запроса и добавить ее вручную ...

Я использую Postgresql 9.6

1 Ответ

0 голосов
/ 19 сентября 2018

Я нашел способ после прочтения документации снова и снова.Я даже обнаружил патч , который не был объединен некоторое время назад.

На самом деле соединение не выполняется, но работает намного быстрее, чем прямое использование __in.

То, что я делаю, - это выполнение RawSQL (), которое было представлено в Django 2.0, и с этим результатом я снова делаю __in.

Итак, вот пример кода:

query = """select myfield from mytable join (values 
             ('v1'), ('v2'), ..., ('vN')
           ) as lookup(value) on lookup.value = mytable.myfield"""
r = RawSQL(query, [])
mymodel.filter(myfield__in=r)

Теперь это занимает миллисекунды вместо минут!

...