/ / АБО у django запитах до бази даних - mysql, django, django-models, django-forms

АБО в запитах бази даних django - mysql, django, django-models, django-forms

У мене є модель, яка має 3 BooleanFields, і ядля запиту бази даних потрібно скористатися формою прапорця. Вихідні дані повинні бути всі записи таблиці, яка має як 1 принаймні одне з полів, які перевіряються. Зараз я маю щось на зразок цього:

f=mform.cleaned_data["F"]
h=mform.cleaned_data["H"]
s=mform.cleaned_data["S"]
course_list=[]
course_list=Course.objects.filter(Q(F=f)|Q(H=h)|Q(S=s))

Але це явно не працює, тому що вона завжди повертає всю таблицю. В основному я хочу отримати всі записи про курс, де будь-яке з цих полів є True. Будь-які ідеї?

Відповіді:

1 для відповіді № 1

Запит: "виберіть всі записи курсу, де (F - True OR H - True OR S - True)"

q_filter = Q()

if mform.cleaned_data["F"]:
q_filter |= Q(F=True)
if mform.cleaned_data["H"]:
q_filter |= Q(H=True)
if mform.cleaned_data["S"]:
q_filter |= Q(S=True)

if q_filter:
course_list = Course.objects.filter(q_filter)
else:
course_list = Course.objects.none()

Це досить базовий підхід. Це може бути зроблено у любителя однієї лінії петля але я захотів поїхати для ясності тут. Ви створюєте об'єкт Q з плином часу. У вашому прикладі ви фільтруєте для значень, які можуть бути True або False, тоді як ви сказали, що ви хочете тільки фільтрувати записи, які мають дане поле з значенням True.