如何在 django 中动态过滤多个值的模型结果

Posted

技术标签:

【中文标题】如何在 django 中动态过滤多个值的模型结果【英文标题】:How to filter model results for multiple values dynamically in django 【发布时间】:2019-02-10 04:45:37 【问题描述】:

我有以下课程模型,包括教授、代码、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条件组合的工作代码):

    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】:

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

【讨论】:

感谢您的快速回复,但我尝试了同样的问题,如果两个请求值不为空,其他两个值为空意味着我必须再次编写 if (coursecode !='None' 和 courselist !='无)和(学期 == '无' 和学期季 == '无'): 如果条件会出现,同样 4c3 = 24 有什么方法可以在 for 循环下构造查询以消除空请求值(我的意思是连接过滤器查询),例如 Course.objects.filter(code=coursecode).filter(title=courselist).filter (semester_year=semesteryear) 我不明白你的第一条评论。您不必编写这样的条件,因为所有if 在上面都是独立的。空的(即"None")将被跳过。就试一试吧。你也可以把它变成一个for 循环,但是对于 4 个条件,这更具可读性。 @Selcuk 如果我选择两个下拉值查询结果仅给出一个结果,则值组合不起作用,这意味着如果我选择下拉代码和课程列表仅给出与代码相关的字段。如何在数据库中找到代码和课程列表组合记录

以上是关于如何在 django 中动态过滤多个值的模型结果的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin:如何过滤特定范围值的整数字段

Django:遍历模板中的过滤列表

Django中模型

Django - 动态模型参数值

如何在查询集中动态设置 Django 过滤器

如何在 django 中过滤对另一个结果的查询?