Как я могу использовать объекты 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_Form в ApplicantSearchForm.

Вернуться на верх