django queryset中有两个或多个__in过滤器

时间:2011-01-05 02:45:56

标签: django django-queryset

我有这个查询

query = 'select * from products where (productnr, supplier_id) in (%s)' % product_list

其中product_list如下所示((OB520,3),(RH402,20)......)

如何使用queryset和__in过滤器

在Django中执行此操作

2 个答案:

答案 0 :(得分:7)

这有什么令人困惑的? http://docs.djangoproject.com/en/1.2/ref/models/querysets/#in似乎很清楚。

问题是什么并不完全清楚。

您是否在询问如何使用多部分密钥?如果是这样,你会对简单的__in感到不满。

如果您正在尝试查找两部分键的“OR”,则必须创建更复杂的条件。

从这里开始:http://docs.djangoproject.com/en/1.2/topics/db/queries/#complex-lookups-with-q-objects

from django.db.models import Q
product_list.filter(
Q(productnr='OB520', supplier_id=3) | Q(productnr='RH402', supplier_id=20))

如果您正在尝试进行多键查找,这就是它必须工作的方式。

或者,您的“in”子句有一长串特定值的问题是什么?

如果您有一个很长的列表,您可能希望分段构建查询。

q_obj= Q()
for p, s in some_list_of_pairs;
   q_obj |= Q(productnr=p, supplier_id=s )
product_list.filter(q_obj)

以上是未经测试的。而且,它可能效率低下。

这样的事情更好。

def values_iter( some_list_of_pairs ):
    for p, s in some_list_of_pairs
        yield product_list.get(productnr=p, supplier_id=s) 

这将一次执行一些非常有效的SQL查找。这可能比构建复杂的多键IN子句执行得更快。

答案 1 :(得分:1)

以逗号分隔查询。

示例:

?groups__in=1,2

有时回答这个问题更好,而不是争论它是一个有效的问题。