2016-06-10 4 views
0

Ich verwende Postgresql-Backend in meiner Django-Anwendung. Ich erstelle ein Anfrage-Set für den Model-Manager, wo ich einen Filter mit mehreren Q-Objekten habe. Ich habe eine Liste von Tupeln, und ich will eines von Q-Objekten, so etwas sein:Kann ich WHERE IN mit mehreren Feldern abfragen, ohne extra und rohe SQL zu verwenden?

WHERE (id, id2) IN (VALUES (1, 1), (2, 1) ...); 

wo Werte sind meine Liste von Tupeln. Django FIELD__in Lookup scheint nur für ein Feld zu sein. Gibt es eine Möglichkeit, dies in einer Datenbankabfrage zu tun, vorzugsweise ohne Verwendung von Raw SQL.

Edit: Mit Django 1.9, PostgreSQL 9.4

Antwort

0

Sie können reduce auf operator.or_ auf einem Q Objekt anwenden beide IDs hält, die Werte aus der Liste von Tupeln nimmt.

import operator 
from functools import reduce 

from django.db.models import Q 

q = reduce(operator.or_, (Q(id=i, id2=j) for i, j in [(1, 1), (2, 1),...])) 

Alle Tupel in der Liste nacheinander auf den Q Objekt übergeben, und verbunden durch eine reduceor verwenden.

Sie buchstäblich haben:

q = Q(id=1, id2=1) | Q(id=2, id2=1) | Q(...)