How to filter model results for multiple values dynamically in django

Viewed 1013

I have following course model with professor, code, semester_season, semester_year, etc

I have request post values:

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

this is my filter a queryset for finding above post values:

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

This is my front end: enter image description here

how can find if one post value is empty find other values in query set dynamically i mean

if no post value means coursecode = None

here i am finding like below:

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

like above multiple if conditions are required. pls suggest me any one how can i do one query with multiple conditions.

Edit (Working code for combination of if conditions):

    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 Answers

You can chain multiple filter conditions. For example:

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)

Note that your order_by clause can be fixed as those columns will always be returned in the result, regardless of they are in the filter or not.

Related