【问题标题】:Django dynamic OR queriesDjango 动态 OR 查询
【发布时间】:2010-09-26 00:21:56
【问题描述】:

我有一个MultipleChoiceField 持有汽车制造商的表格。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有Q(make=...) 语句?

我如何开始:['value1', 'value2', ...]

我想如何结束:Q(col='value1') | Q(col='value2') | ...

我还有其他几种方法。我尝试为每个 make 附加查询集并以相反的方式执行(执行多个排除),但它们都非常慢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    #django 中提供了另一种方法:

    reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])
    

    Ber's method 非常适合这种情况,但如果您需要过滤动态列,映射看起来是下一个最干净的方式。

    【讨论】:

    • 如果动态构造参数,也可以在此处使用 __in 运算符: query={'%s__in'%col_name: list_of_values} Model.objects.filter(**query) 使用关键字 arg 扩展
    • 我认为,这种情况下的地图应该被reduce替换。
    【解决方案2】:

    我尝试了 Oli 的答案,但它不起作用,即使使用 reduce(),因为它似乎 Q 对象不接受字典作为参数:

    这是我的工作方式:

    # These are the fields I want to search with an OR clause
    search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains']
    
    search = 'search string'
    clauses = []
    for item in search_fields:
        clauses.append(queryset.filter(**{item: search}))
        queryset  = reduce(lambda x, y: x | y, clauses).distinct()
    

    检查性能问题,因为我只能使用小数据集进行测试。

    【讨论】:

      【解决方案3】:

      你试过了吗:Model.objects.filter(make__in=list_of_makes)?

      list_of_makes 是 MultipleChoiceField 返回的内容

      有关 __in 运算符的信息,请参阅 the query set reference。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 2010-10-25
        • 1970-01-01
        相关资源
        最近更新 更多