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

jjg*_*jgg 4 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'
    )
Run Code Online (Sandbox Code Playgroud)

上面循环的问题是,对于大量的项目编号来说,它会非常慢。有没有更有效的方法来做到这一点?

dam*_*mon 6

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

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

在 Django ORM 中,您可以通过使用一系列Q对象来组合过滤器。

重构循环以使用Q“或”在一起的对象将如下所示:

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')
Run Code Online (Sandbox Code Playgroud)