У меня есть такая модель
class Customer(models.Model):
#fields
doctor = models.ForeignKey(Doctor)
Я хотел создать форму клиента для поиска, поэтому я создал новую форму (а не ModelForm, потому что мне нужны только поля формы, а не метод сохранения), в котором есть поля клиента. Функциональность, которую я хочу достичь:
- Если форма пуста и пользователь нажимает поиск, покажите всем клиентам
- Если в форме есть поля с данными, выполните поиск AND с полями
Поля поиска, которые я выполнил для тестовых щенков, следующие: имя_первого_имя, last_name и врача. Я использовал объекты Q следующим образом:
if customer_form.is_valid():
post_data = customer_form.cleaned_data
customers = Customer.objects.filter(
Q(first_name__icontains=post_data['first_name']) &
Q(last_name__icontains=post_data['last_name']) &
Q(doctor=post_data['doctor'])
)
который не будет работать, если я не выбрал врача в выбранном поле формы. Если я удалю
Q(doctor-post_data['doctor']
поиск работает так, как ожидалось. Если я оставлю это как есть и выберем врача из поля выбора формы, тогда он работает, но это не то, что я хочу. Почему добавление доктора нарушает функциональность?
The form is:
class CustomerSearchForm(Form):
#form fields
doctor = forms.ModelChoiceField (required=False, queryset=Doctor.objects.all(), widget=Select(attrs={"class":"form-control input-sm"}))
Что может быть неправильным?
Вы можете условно выразить свои выражения Q
:
qexpr = ( Q(first_name__icontains=post_data['first_name']) &
Q(last_name__icontains=post_data['last_name']) )
if post_data['doctor']:
qexpr &= Q(doctor=post_data['doctor'])
customers = Customer.objects.filter(qexpr)
Безусловный фильтр на doctor=post_data['doctor']
будет оцениваться doctor=None
если ничто не будет выбрано на входе doctor
вашей формы, которое затем переведет либо в doctor_id = NULL
либо в doctor_id IS NULL
в сгенерированном SQL-запросе ( не знаю, как Django ORM справится с этим, и я не тестировал), ни один из которых не будет соответствовать никаким записям в вашей модели.