【问题标题】:Dummy filters in DjangoDjango 中的虚拟过滤器
【发布时间】:2015-10-18 07:57:11
【问题描述】:

如何在 Django 中进行虚拟过滤器查询(始终匹配的过滤器)和从不匹配的排除查询。原因是我的查询是 None 的情况,在这些情况下我想使用一个虚拟过滤器。这是代码:

MyModel.objects.filter(filterQuery).exclude(excludeQuery)

如果filterQueryexcludeQueryNone 我收到错误,所以我想在该查询之前添加以下条件:

if filterQuery == None: filterQuery = ???
if excludeQuery == None: excludeQuery = ???
MyModel.objects.filter(filterQuery).exclude(excludeQuery)

【问题讨论】:

    标签: python django django-models django-queryset django-orm


    【解决方案1】:

    您应该只在需要时过滤/排除,而不是使用空语句,这样做:

    found = MyModel.objects.all()
    if filterQuery:
        found = found.filter(filterQuery)
    if excludeQuery:
        found = found.exclude(excludeQuery)
    

    【讨论】:

      【解决方案2】:

      最好的方法是使用字典,特别是如果你有复杂的过滤器。

      filterQuery = excludeQuery = {}
      
      # optionally set the filters based on some logic
      if 1==1:
        filterQuery['agent'] = 'John'
      
      if 2==2:
        excludeQuery['user_id__in'] = [1, 2]
      
      if 3==3:
        filterQuery['time__gte'] = timezone.now()
      
      MyModel.objects.filter(**filterQuery).exclude(**excludeQuery)
      

      您可以像尚建议的那样添加一些 if 来查看是否需要应用过滤器,但我怀疑性能损失很大,而且这更具可读性。

      【讨论】:

        【解决方案3】:

        我上面回答的另一种选择是使用 Q() 表达式,特别是如果您需要和/或逻辑:

        filterQuery = Q()
        
        filterQuery = filterQuery | Q(agent='John')
        filterQuery = filterQuery & Q(time__gte=timezone.now())
        
        ...
        
        MyModel.objects.filter(filterQuery)
        

        【讨论】:

          猜你喜欢
          • 2015-10-25
          • 1970-01-01
          • 1970-01-01
          • 2016-09-20
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 2021-04-29
          • 2014-01-30
          相关资源
          最近更新 更多