Я пытаюсь понять, как написать запрос стиля «не в» в django. Например, структура запроса, о которой я думаю, будет выглядеть так.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
Как будет выглядеть синтаксис django, если предположить, что модели под названием table1 и table2?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
Это не сработало, потому что идентификаторы на самом деле являются объектом QuerySet. Когда я удалил строки, из которых он произошел, он больше не работал с другими запросами. РешениеTbl2.objects.filter(id__in=list(IDs))
- превратите его в списокannotate()
(timeit дал мне 1,0497902309998608 против 0,00514069400014705)с этими моделями:
вы должны получить то, что хотите, используя:
источник
источник
Вы можете написать собственный поиск для запросов Django:
Из документации : «Давайте начнем с простого пользовательского поиска Мы будем писать пользовательские подстановок нэ , который работает напротив взыскать . Author.objects.filter (name__ne =„Jack“) переведет к SQL:
"author"."name" <> 'Jack'
»источник
Или лучше
источник