2010-09-26 9 views
9

In Django, wie fragen Sie nach zwei verschiedenen Werten, wie im Folgenden?Django Abfrage mit OR-Bedingung

profile_setting = (pSetting.objects.get(module="my_mod", setting_value=1) or 
        pSetting.objects.get(module="my_mod", setting_value=0)) 

Antwort

10

Kasse Djangos Q-class:

profile_setting = pSetting.objects.get(Q(module="my_mod"),\ 
        Q(setting_value=1)|Q(setting_value=0)) 

Weiterhin Ihre Codierung zu verbessern Stil, werfen Sie einen Blick auf einige coding guidelines, sollten Sie besser Ihre Modellklasse PSetting nennen.

+0

Ich stimme dem Stil zu - siehe auch Python's PEP8 (http://www.python.org/dev/peps/pep-0008/) für Style Guide. – bx2

3

Es gibt ein Q() Objekt für diese Aufgabe - hier: Complex Queries with Q() object

Im Beispiel:

profile_setting = pSetting.objects.get(
    Q(module="my_mod", setting_value=1) | Q(module="my_mod", setting_value=0) 
) 
1
profile_setting = pSetting.objects.get(module="my_mod",setting_value__in=[0,1]) 
4

Sind Sie sicher, dass Sie nur ein Objekt greifen?

Wenn Sie eine queryset eines Bündels von Gegenständen zu greifen versuchen, alles, was Sie tun müssen, um Ketten Filter zusammen:

profile_setting = pSetting.objects.filter(module="my_mod", setting_value__in=0) 
         .filter(module="my_mod", setting_value__in=1) 

Da jedoch alles andere als SETTING_VALUE gleich ist, können Sie einfach nach eine Liste oder Tupel:

profile_setting = pSetting.objects.filter(module="my_mod", setting_value__in=[0,1]) 

(alexdb Vorschlag oben ist in Ordnung, wenn und nur wenn Sie sicher sind, dass Sie nur ein Objekt als eine Antwort auf Ihre Frage bekommen würden)

0

Für diese Art von Abfrage überprüfen Sie diese Dokumentation link

und für Ihr spezifisches Problem können Sie mehrere Queryset-Objekte (Q) für die Verwendung von queryset übergeben | für OR-Bedingung und & für UND-Bedingung in den Funktionen get() und filter().