Как динамически фильтровать результаты модели для нескольких значений в Django - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующая модель курса с профессором, кодом, semester_season, semester_year и т. Д.

У меня есть запрос сообщения значения:

coursecode = request.POST['coursecode']
courselist = request.POST['courselist']
semesteryear = request.POST['semesteryear']
semesterseason = request.POST['semesterseason']

это мой фильтр набор запросов для поиска указанных выше значений сообщения:

course_listobj = Course.objects.filter(
  code=coursecode,
  title=courselist,
  semester_year=semesteryear,
  semester_season=semesterseasonid).order_by(
    'code', 'title', 'semester_year', 'semester_season')

Это мой интерфейс: enter image description here

как найти, если одно значение сообщения пусто, найти другие значения в наборе запросов динамически, я имею в виду

, если никакое почтовое значение не означает coursecode = None

здесь я нахожу, как показано ниже:

if (coursecode != 'None') and (courselist == 'None' and semesteryear == 'None' and semesterseason == 'None'):
    course_listobj = Course.objects.filter(code=coursecode).order_by('code')

как указано выше, если требуется несколько условий. Пожалуйста, предложите мне любой, как я могу сделать один запрос с несколькими условиями.

Редактировать (Рабочий код для комбинации условий if):

    coursecode = request.POST['coursecode']
    courselist = request.POST['courselist']
    semesteryear = request.POST['semesteryear']
    semesterseason = request.POST['semesterseason']

    courses = Course.objects.all().order_by(
        'code', 'title', 'semester_year', 'semester_season')

    coursecodequery = Q(code=coursecode) if coursecode != 'None' else Q()
    courselistquery = Q(title=courselist) if courselist != 'None' else Q()
    semesteryearquery = Q(semester_year=semesteryear) if semesteryear != 'None' else Q()
    semesterseasonquery = Q(semester_season=semesterseason) if semesterseason != 'None' else Q()

    course_listobj = courses.filter(
        coursecodequery & courselistquery & semesteryearquery & semesterseasonquery
    )

    if coursecode == 'None' and courselist == 'None' and semesteryear == 'None' and semesterseason == 'None':
       messages.info(request, 'Please select all fields')

    if not course_listobj:
       messages.info(request, 'No matching courses')

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете связать несколько filter условий. Например:

courses = Course.objects.all().order_by(
  'code', 'title', 'semester_year', 'semester_season')
if coursecode != 'None':
    courses = courses.filter(code=coursecode)
if courselist != 'None':
    courses = courses.filter(title=courselist)
if semesteryear != 'None':
    courses = courses.filter(semester_year=semesteryear)
if semesterseason != 'None':
    courses = courses.filter(semester_season=semesterseason)

Обратите внимание, что ваше предложение order_by можно исправить, так как эти столбцы всегда будут возвращаться в результате, независимо от того, есть они в filter или нет.

...