Próbuję dowiedzieć się, jak napisać zapytanie w stylu „nie w” w django. Na przykład struktura zapytania, o której myślę, wyglądałaby tak.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
Jak wyglądałaby składnia django przy założeniu modeli o nazwach tabela1 i tabela2?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
To nie zadziałało, ponieważ IDs to w rzeczywistości obiekt QuerySet. Kiedy usunąłem wiersze, z których pochodzi, nie działało już z innymi zapytaniami. Rozwiązaniem jestTbl2.objects.filter(id__in=list(IDs))
-annotate()
postać „mając count (xx) == yy”, jego użycie jest ponad 100 razy szybsze (czas dał mi 1,0497902309998608 w porównaniu z 0,00514069400014705)z tymi modelami:
powinieneś dostać to, czego chcesz, używając:
źródło
źródło
Możesz napisać własne wyszukiwanie zapytań Django:
Z dokumentacji : „Zacznijmy od prostego niestandardowego wyszukiwania . Napiszemy niestandardowe wyszukiwanie ne, które działa odwrotnie do dokładnego . Author.objects.filter (name__ne = 'Jack') przetłumaczy na SQL:
"author"."name" <> 'Jack'
”źródło
Albo lepiej
źródło