объекты django q и более продвинутый поиск

Вопрос:

У меня есть такая модель

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 справится с этим, и я не тестировал), ни один из которых не будет соответствовать никаким записям в вашей модели.

Оцените статью
TechArks.Ru
Добавить комментарий