首页 > 解决方案 > 如何在 django 中动态过滤多个值的模型结果

问题描述

我有以下课程模型与教授、代码、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')

这是我的前端: 在此处输入图像描述

如何查找一个帖子值是否为空动态查找查询集中的其他值我的意思是

如果没有后值意味着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 条件是必需的。请向我建议任何人我怎样才能在多个条件下进行一次查询。

编辑(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')

标签: djangomodeldjango-queryset

解决方案


您可以链接多个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


推荐阅读