2016-09-05 1 views
1

Мне нужно сделать что-то подобное, чтобы соответствовать некоторым объектам. Это лучший способ сделать это? Возможно ли это сделать быстрее?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

Возможный дубликат [Джанго Фильтры - или] (http://stackoverflow.com/questions/739776/django-filters-or) – Sayse

ответ

2

Если вы хотите использовать один из этого состояния, просто использовать Q объект, это позволяет использовать логику or оператора в запросе.

from django.db.models import Q 

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

В этом случае | означает or и , означает and, так что возраст требуется в обоих условиях.

1

Учитывая имя переменной, я думаю, вы ожидаете, что приведенный выше запрос вернет одного пользователя. Таким образом, вы можете устранить еще один удар db с помощью .first():

.first().first() в основном возвращает первый объект, соответствующий запросу, или None, если его нет. Таким образом, вам не нужно выполнять .exists().

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