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)
)
Вернуться на верх