DRF многопольный базовый фильтр соответствия кверисета
Я создаю функциональность поиска, где мы можем искать на основе
first_name
,last_name
,username
.Он должен фильтровать все совпадения (если хотя бы все поля совпадают, он должен считать) пользователей, за исключением пользователей входа.вот что я сделал, но я ищу эффективный Django queryset.
if search_name is not None and len(search_name) >= 3: search_obj_1 = User.objects.filter(first_name__iexact=search_name).exists() search_obj_2 = User.objects.filter(last_name__iexact=search_name).exists() if search_obj_1: search_obj_1 = User.objects.filter(Q(first_name__iexact=search_name)) &User.objects.filter(~Q(id=logged_user_id)) search_obj_2 = User.objects.filter(Q(last_name__iexact=search_name)) & User.objects.filter(~Q(id=logged_user_id)) search_obj_3 = [] search_obj = list(chain(search_obj_1, search_obj_2, search_obj_3)) elif search_obj_2: search_obj_1 = [] search_obj_2 = User.objects.filter( Q(last_name__iexact=search_name)) & User.objects.filter(~Q(id=logged_user_id)) search_obj_3 = User.objects.filter( Q(username__iexact=search_name)) & User.objects.filter(~Q(id=logged_user_id)) search_obj = list( chain(search_obj_2, search_obj_3, search_obj_1)) else: search_obj_1 = [] search_obj_2 = [] search_obj_3 = User.objects.filter( Q(username__iexact=search_name)) & User.objects.filter(~Q(id=logged_user_id)) search_obj = list( chain(search_obj_3, search_obj_1, search_obj_2))
так есть ли лучший способ сделать то же самое.
Вы можете попробовать что-то вроде этого (используя оператор объединения |
) :
search_obj = User.objects.exclude(id=logged_user_id).filter(
Q(first_name__iexact=search_name)
| Q(last_name__iexact=search_name)
| Q(username__iexact=search_name)
)