在django中运行许多startwith查询的最快方法

时间:2018-02-17 00:28:31

标签: sql django

我有一个项目编号列表,可以是数千个元素。我需要在我的SQL数据库中搜索以列表中的数字开头的记录。我使用的是django ORM,但原始的sql也可以。

作为示例,我的列表可能如下所示:['123ab','234dd','421ad']

我试图找到一个比循环遍历列表并且每次都运行一个startswith查询更好的解决方案:

for element in list:
    Item.objects.filter(
        item_number__startswith=element
    ).values(
        'item_number',
        'manufacturer'
    )

上面的循环问题是,对于大量的项目编号,它会非常慢。有没有更有效的方法呢?

1 个答案:

答案 0 :(得分:2)

更有效的方法是在单个数据库查询中包含所有过滤器。

为了保持代码的可移植性和易于理解,我建议尽可能避免使用原始SQL。

在Django ORM中,您可以combine your filters by using a series of Q objects

重构你的循环以使用Q个对象" OR" ed将如下所示:

from django.db.models import Q

query_filters = Q()
for item_number_prefix in item_number_prefixes:
    query_filters |= Q(item_number__startswith=item_number_prefix)

queryset = Item.objects.filter(query_filters).values('item_number', 'manufacturer')