【问题标题】:Using wildcard to do queryset filter in Django在 Django 中使用通配符进行查询集过滤
【发布时间】:2017-07-24 19:26:05
【问题描述】:

我的数据库中有三列(var1、va2 和 var3)。

在 html 页面上,用户可以输入 var1、var2 或 var3 的值或三个变量的组合(例如,仅提供 var1 和 var3 或 var2 和 var3 的数据)。

我的查询搜索是:

Rule.objects.filter(var1=user_var1, var2=user_var2, var3=user_var3, )

如果用户输入所有三个变量的值,这非常简单。

如果用户输入两个或一个变量的值,我希望查询集过滤器只匹配用户输入值的列。例如:用户为 var2 和 var3 输入数据。结果搜索将是:

Rule.objects.filter(var2=user_var2, var3=user_var3, )

但是有没有办法将所有三个变量都保留在过滤器代码中,例如:

if user_var1 = null, then user_var1=[wildcard or all]

Rule.objects.filter(var1=user_var1, var2=user_var2, var3=user_var3, )

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    可能是或像以前的答案

    filter_vars = ['vars1', 'vars2', 'vars3']
    filter_dic = {}
    for item in filter_vars:
        user_var = request.GET.get(item, '')
        if user_var:
           filter_dic[item] = user_var
    Rule.objects.filter(**filter_dic)
    

    【讨论】:

      【解决方案2】:

      如果提供的值返回所有查询集,则准备要应用的过滤器字典:

      filters = {}
      if user_var1:
          filters['var1'] = user_var1
      if user_var2:
          filters['var2'] = user_var2
      qs = Rule.objects.filter(**filters)
      

      【讨论】:

      • 为什么要先做一个qs再过滤。为什么不直接通过 dict 过滤呢?
      • @HC 你可以,我只是想解释一下。请参阅更新的代码。谢谢!
      • 谢谢。我想可能是它使代码运行得更快。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2013-03-16
      • 1970-01-01
      • 2012-03-12
      • 2017-04-13
      相关资源
      最近更新 更多