Какой лучший способ поиска по нескольким полям в django?
У меня есть следующая модель в моем models.py
, и я хочу выполнить поиск на основе трех ее полей.
class Profile(models.Model):
username = models.CharField(max_length=128, null=False, blank=False, unique=True)
password = models.CharField(max_length=128, null=False, blank=False)
name = models.CharField(max_length=50, null=True, blank=True)
lastname = models.CharField(max_length=50, null=True, blank=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children', on_delete=models.CASCADE)
Также есть три отдельных входа для ввода текста, один для name
, один для last name
и один для username
. Пользователь должен заполнить хотя бы один вход, или, если строка ввода была частью основной строки, должна быть возвращена основная строка.
Это мой API, но он ничего не возвращает, и список результатов всегда пуст.
def search_users(request):
if request.method == 'GET':
try:
to_be_searched_username = request.GET.get("username", None)
to_be_searched_name = request.GET.get("name", None)
to_be_searched_lastname = request.GET.get("lastname", None)
supervisor_username = request.headers['Authorization']
supervisor = Profile.objects.get(username=supervisor_username)
if not((to_be_searched_name or to_be_searched_lastname) or to_be_searched_username):
return Response({"message": "Enter a search term"}, status=status.HTTP_204_NO_CONTENT)
else:
results = supervisor.children.filter(
username__icontains=to_be_searched_username and to_be_searched_username is not None
).filter(
name__icontains=to_be_searched_name and to_be_searched_name is not None
).filter(
lastname__icontains=to_be_searched_lastname and to_be_searched_lastname is not None
)
return Response({'results': results}, status=status.HTTP_200_OK)
except:
return Response({"message": "خطا در دریافت اطلاعات"}, status=status.HTTP_400_BAD_REQUEST)
Буду благодарен за любую помощь или совет.
Вы можете фильтровать с помощью:
def search_users(request):
if request.method == 'GET':
to_be_searched_username = request.GET.get('username')
to_be_searched_name = request.GET.get('name')
to_be_searched_lastname = request.GET.get('lastname')
supervisor_username = request.headers['Authorization']
supervisor = get_object_or_404(Profile, username=supervisor_username)
if not (
to_be_searched_name
or to_be_searched_lastname
or to_be_searched_username
):
return Response(
{"message": "Enter a search term"},
status=status.HTTP_204_NO_CONTENT,
)
else:
results = supervisor.children.all()
if to_be_searched_username:
results = results.filter(
username__icontains=to_be_searched_username
)
if to_be_searched_name:
results = results.filter(name__icontains=to_be_searched_name)
if to_be_searched_lastname:
result = result.filter(
lastname__icontains=to_be_searched_lastname
)
return Response({'results': results}, status=status.HTTP_200_OK)