J'essaie de comprendre comment écrire une requête de style «pas dans» dans django. Par exemple, la structure de requête à laquelle je pense ressemblerait à ceci.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
À quoi ressemblerait la syntaxe de django en supposant des modèles appelés table1 et table2?
Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')
Cela n'a pas fonctionné car IDs est en fait un objet QuerySet. Lorsque j'ai supprimé les lignes dont il provenait, cela ne fonctionnait plus avec d'autres requêtes. La solution estTbl2.objects.filter(id__in=list(IDs))
- en faire une listeannotate()
(timeit m'a donné 1.0497902309998608 vs 0.00514069400014705)avec ces modèles:
vous devriez obtenir ce que vous voulez en utilisant:
la source
la source
Vous pouvez écrire une recherche personnalisée pour les requêtes Django:
De la documentation : "Commençons par une simple recherche personnalisée. Nous allons écrire une recherche personnalisée ne qui fonctionne à l'opposé d' exact . Author.objects.filter (name__ne = 'Jack') se traduira par le SQL:
"author"."name" <> 'Jack'
"la source
Ou mieux
la source