Ich versuche herauszufinden, wie man eine Abfrage im "Nicht in" -Stil in Django schreibt. Zum Beispiel würde die Abfragestruktur, an die ich denke, so aussehen.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
Wie würde die Django-Syntax unter der Annahme von Modellen mit den Namen table1 und table2 aussehen?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
gestoßen. Wenn es also jemand anderem passiert ... Dies hat nicht funktioniert, da IDs tatsächlich ein QuerySet-Objekt sind. Als ich die Zeilen löschte, aus denen es stammte, funktionierte es nicht mehr mit anderen Abfragen. Die Lösung istTbl2.objects.filter(id__in=list(IDs))
- verwandeln Sie es in eine Listeannotate()
100-mal schneller zu verwenden (timeit gab mir 1.0497902309998608 vs 0.00514069400014705)mit diesen Modellen:
Sie sollten bekommen, was Sie wollen mit:
quelle
quelle
Sie können eine benutzerdefinierte Suche für Django-Abfragen schreiben:
Aus der Dokumentation : „Beginnen wir mit einer einfachen benutzerdefinierten Lookup Wir werden eine benutzerdefinierte Nachschlag schreiben ne , die gegenüber arbeitet , um exakt . Author.objects.filter (name__ne =‚Jack‘) wird dem SQL übersetzen:
"author"."name" <> 'Jack'
“quelle
Oder besser
quelle