Как я могу использовать объекты Q на двух формах динамического поиска в Django
Я работаю над проектом Django, в котором я хочу искать записи профиля для тех, кто проживает в определенной стране и штате.
В этом проекте я буду собирать данные о людях из разных стран и их соответствующих штатов, поэтому мне нужна ситуация, в которой я смогу иметь две формы поиска для страны и штата.
Форма должна позволять мне выбирать список стран в модели профиля, а форма штата должна позволять мне вводить и искать штат в выбранной стране.
Результатом должен быть список людей в выбранной стране и искомом штате.Пожалуйста, поймите, что я решил использовать Q-объекты, потому что узнал, что это делает запросы эффективными.
Вот код моей модели:
class Profile(models.Model):
applicant = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
surname = models.CharField(max_length=10, null=True)
othernames = models.CharField(max_length=30, null=True)
gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
nation = models.CharField(max_length=10, choices=NATION, blank=True, null=True)
state = models.CharField(max_length=20, null=True)
address = models.CharField(max_length=200, null=True)
phone = models.CharField(max_length=11, null=True)
image = models.ImageField(default='avatar.jpg', upload_to ='profile_images')
Вот код моей поисковой формы:
class Applicant_Search_Form(forms.ModelForm):
class Meta:
model = Profile
fields = ['nation', 'state']
Вот мой код представления:
def SearchApplicants(request):
form = Applicant_Search_Form(request.GET or None)
if form:
list_submited = Q(nation__icontains = form['nation'].value()) & Q(state__icontains = form['state'].value())
else:
list_submited = Profile.objects.all()
paginator = Paginator(list_submited, 5)
page = request.GET.get('page')
paged_listApps = paginator.get_page(page)
context = {
'list_applicants':paged_listApps,
'form':form,
}
return render(request, 'user/list_applicants.html',context)
Я попробовал выполнить приведенный выше код, но у меня возникла ошибка TypeError, которая говорит, что объект 'Q' не является подзаписываемым.
Кто-нибудь должен любезно помочь с тем, как решить эту проблему и, возможно, лучший подход к этому виду поиска.Спасибо в ожидании ваших ответов.
Вы должны отфильтровать набор запросов Profile.objects.all(), так:
def SearchApplicants(request):
form = Applicant_Search_Form(request.GET)
if form.is_valid():
list_submited = Profile.objects.filter(
nation__icontains=form.cleaned_data['nation'],
state__icontains=form.cleaned_data['state']
)
else:
list_submited = Profile.objects.all()
# …
Примечание: Функции обычно пишутся в snake_case, а не PascalCase, поэтому следует рекомендуется переименовать вашу функцию в
search_applicants, а не.SearchApplicants
Примечание: Формы в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вApplicant_Search_FormApplicantSearchForm.