Estoy tratando de averiguar cómo escribir una consulta de estilo 'no en' en django. Por ejemplo, la estructura de consulta en la que estoy pensando se vería así.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
¿Cómo se vería la sintaxis de django asumiendo modelos llamados table1 y table2?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
Esto no funcionó porque ID es en realidad un objeto QuerySet. Cuando eliminé las filas desde las que se originó, ya no funcionó con otras consultas. La solución esTbl2.objects.filter(id__in=list(IDs))
- convertirlo en una listaannotate()
(el tiempo me dio 1.0497902309998608 vs 0.00514069400014705)con estos modelos:
deberías obtener lo que quieres usando:
fuente
fuente
Puede escribir una búsqueda personalizada para consultas de Django:
De la documentación : "Comencemos con una búsqueda personalizada simple. Escribiremos una búsqueda personalizada ne que funcione de manera opuesta a exacta . Author.objects.filter (name__ne = 'Jack') se traducirá al SQL:
"author"."name" <> 'Jack'
"fuente
O mejor
fuente