Estou tentando descobrir como escrever uma consulta do estilo 'não está em' no Django. Por exemplo, a estrutura de consulta em que estou pensando seria assim.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
Como seria a sintaxe do django assumindo modelos chamados table1 e table2?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
Isso não funcionou porque IDs é na verdade um objeto QuerySet. Quando eu apaguei as linhas das quais ele se originou, ele não funcionou mais com outras consultas. A solução éTbl2.objects.filter(id__in=list(IDs))
- transformá-lo em uma listaannotate()
(timeit me deu 1,0497902309998608 vs 0,00514069400014705)com estes modelos:
você deve conseguir o que deseja usando:
fonte
fonte
Você pode escrever uma pesquisa personalizada para consultas Django:
Da documentação : "Vamos começar com uma pesquisa personalizada simples. Vamos escrever uma pesquisa personalizada ne que funciona em oposição ao exato . Author.objects.filter (name__ne = 'Jack') irá traduzir para o SQL:
"author"."name" <> 'Jack'
"fonte
Ou melhor
fonte