2 Stimmen

Zwei oder mehr __in-Filter in django queryset

Ich habe folgende Frage

query = 'select * from products where (productnr, supplier_id) in (%s)' % product_list

wobei product_list wie folgt aussieht ((OB520, 3),(RH402, 20)...)

Wie gehe ich über tun dies in Django mit queryset und der __in-Filter

7voto

S.Lott Punkte 371691

Welcher Teil davon ist verwirrend? http://docs.djangoproject.com/en/1.2/ref/models/querysets/#in Es scheint sehr klar zu sein.

Aus der Frage geht nicht eindeutig hervor, worin das Problem besteht.

Fragen Sie, wie man einen mehrteiligen Schlüssel verwendet? Wenn ja, werden Sie mit einer einfachen Taste unglücklich sein. __in .

Wenn Sie nach einem "ODER" eines zweiteiligen Schlüssels suchen, müssen Sie eine komplexere Bedingung schaffen.

Beginnen Sie hier: http://docs.djangoproject.com/en/1.2/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models import Q
product_list.filter(
Q(productnr='OB520', supplier_id=3) | Q(productnr='RH402', supplier_id=20))

Wenn Sie nach mehreren Schlüsseln suchen wollen, muss es auf diese Weise funktionieren.

Oder liegt das Problem darin, dass Ihre "in"-Klausel eine lange Liste von spezifischen Werten enthält?

Wenn Sie eine lange Liste haben, sollten Sie die Abfrage in Teilen erstellen.

q_obj= Q()
for p, s in some_list_of_pairs;
   q_obj |= Q(productnr=p, supplier_id=s )
product_list.filter(q_obj)

Diese Angaben sind nicht geprüft. Außerdem ist es wahrscheinlich ineffizient.

Besser ist so etwas wie das hier.

def values_iter( some_list_of_pairs ):
    for p, s in some_list_of_pairs
        yield product_list.get(productnr=p, supplier_id=s) 

Dadurch wird eine Reihe von sehr effizienten SQL-Abfragen nacheinander durchgeführt. Das kann schneller gehen als die Erstellung einer komplexen IN-Klausel mit mehreren Schlüsseln.

2voto

Trennen Sie die Abfrage durch Kommata ab.

Exemple :

?groups__in=1,2

Manchmal ist es besser, die Frage zu beantworten, als darüber zu streiten, ob die Frage berechtigt ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X