Условный поиск в фильтре django - PullRequest
1 голос
/ 08 апреля 2020

Я хочу получить некоторые данные из моей базы данных следующим образом

from .models import Student

#activity is a many to many field

students = Student.objects.filter(name="doe",activity__name__icontains='a' or 'b').distinct().all()

Это сработает ?.

Но моя проблема в том, что у меня есть список элементов для проверки по действиям и если я попробую это следующим образом ? ... это не удастся

activities = ['a','b','c']
students = Student.objects.filter(name="doe",activity__name__icontains=activities).distinct().all()

Длина списка не постоянна, она всегда меняется.

Я был бы признателен за любую руку помощи.

Спасибо

1 Ответ

1 голос
/ 08 апреля 2020

Первый не работает, он никогда не будет соответствовать вещам, которые не содержат 'a', но содержат 'b'. or будет проверять достоверность 'a' и, следовательно, никогда не будет принимать во внимание 'b'.

Что касается списка, вы можете работать с Q объектом здесь:

from django.db.models import <b>Q</b>

activities = ['a','b','c']
activity_filter = <b>Q(</b>
    *[('activity__name__icontains',activity) for activity in activities],
    _connector=Q.OR
<b>)</b>

students = Student.objects.filter(<b>activity_filter,</b> name='doe').distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...