2016-09-05 4 views
1

Ich muss etwas tun, damit einige Objekte übereinstimmen. Dies ist der beste Weg, es zu tun? Ist es möglich, es schneller zu machen?Django Queryset

if User.objects.filter(first_name=name, age=age).exists(): 
    user = User.objects.filter(first_name=name, age=age) 
    function_x(user) 
elif User.objects.filter(full_name__icontains=name, age=age).exists(): 
    user = User.objects.filter(full_name__icontains=name, age=age) 
    function_x(user) 
+1

Mögliche Duplikate von [Django Filters - oder?] (Http://stackoverflow.com/questions/739776/django-filters-or) – Sayse

Antwort

2

Wenn Sie eines dieser Bedingung verwenden möchten, nur Q Objekt verwenden, ermöglicht es Ihnen Logik or Operator in Ihrer Abfrage verwenden.

from django.db.models import Q 

User.objects.filter(Q(first_name=name) | 
        Q(full_name__icontains=name), 
        age=age) 

In diesem Fall bedeutet |or und ,and bedeutet, so Alter ist in beiden Bedingungen erforderlich.

1

Angesichts der Variablen Name, ich denke, Sie erwarten, dass die obige Abfrage einen einzelnen Benutzer zurückgibt. Sie können also einen weiteren db-Treffer mit .first() löschen:

.first() gibt im Grunde das erste Objekt zurück, das vom Abfrage-Set abgeglichen wird, oder None, falls nicht eins vorhanden ist. Auf diese Weise müssen Sie .exists() nicht ausführen.

user = User.objects.filter(Q(first_name=name) | Q(full_name__icontains=name), age=age).first()