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

Bin*_*mar 2 django django-queryset

我有这个问题

query = 'select * from products where (productnr, supplier_id) in (%s)' % product_list
Run Code Online (Sandbox Code Playgroud)

product_list看起来像这样((OB520,3),(RH402,20)...)

如何使用queryset和__in过滤器在Django中执行此操作

S.L*_*ott 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))
Run Code Online (Sandbox Code Playgroud)

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

或者,您的"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)
Run Code Online (Sandbox Code Playgroud)

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

什么是更好的是这样的.

def values_iter( some_list_of_pairs ):
    for p, s in some_list_of_pairs
        yield product_list.get(productnr=p, supplier_id=s) 
Run Code Online (Sandbox Code Playgroud)

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

  • 问题不明确?真?问题很简单.您如何使用具有两个或更多字段/值的__in过滤器?产品列表最多可包含3000个项目. (2认同)
  • @Bingimar:“产品列表最多可以涵盖3000个项目”?这是问题吗?我没看到 您可以声称这很清楚。这是您的问题,您当然理解。有趣的是,我不是你。对我来说还不清楚。我不是一个瘦弱的人,不是那么聪明,也不是那么漂亮。您可以重复这个问题。或者,您可以“更新”该问题以帮助像我这样的人理解它。重复它似乎没有帮助。扩大和解释,并包括所有事实,似乎很有帮助。 (2认同)