如何在 Django 中使用 itertools.chain 执行多个排除命令?
How to do multiple exclude commands using itertools.chain in Django?
假设我想 运行 exclude 命令重复从 exclude_list 获取变量,例如['aa', 'ab' 'ac'].
我可以使用循环来做到这一点:
for exclude_value in exclude_list:
myQueryset.exclude(variable__startswith=exclude_value)
但是,我想使用 itertools.chain 命令来实现,因为我已经阅读过它可以这样做。有什么建议吗?
您的做法是正确的 - 除了一个小细节外,您没有保留排除项。 Django querysets are lazily evaluated, so running through a loop and continually chaining won't do anything,直到您尝试访问集合中的内容。
如果你这样做:
qs = MyModel.objects
for exclude_value in exclude_list:
qs = qs.exclude(variable__startswith=exclude_value)
qs = None
数据库从未命中。
所以这样做:
qs = MyModel.objects
for exclude_value in exclude_list:
qs = qs.exclude(variable__startswith=exclude_value)
qs.count() # Or whatever you want the queryset for
你应该没问题,if/when你遇到了数据库变慢的问题,这很可能是因为查询中有大量的自由文本表达式,然后做一些分析,然后你就可以找到效率。
但我敢打赌上面的代码足以满足您的需求。
假设我想 运行 exclude 命令重复从 exclude_list 获取变量,例如['aa', 'ab' 'ac'].
我可以使用循环来做到这一点:
for exclude_value in exclude_list:
myQueryset.exclude(variable__startswith=exclude_value)
但是,我想使用 itertools.chain 命令来实现,因为我已经阅读过它可以这样做。有什么建议吗?
您的做法是正确的 - 除了一个小细节外,您没有保留排除项。 Django querysets are lazily evaluated, so running through a loop and continually chaining won't do anything,直到您尝试访问集合中的内容。
如果你这样做:
qs = MyModel.objects
for exclude_value in exclude_list:
qs = qs.exclude(variable__startswith=exclude_value)
qs = None
数据库从未命中。
所以这样做:
qs = MyModel.objects
for exclude_value in exclude_list:
qs = qs.exclude(variable__startswith=exclude_value)
qs.count() # Or whatever you want the queryset for
你应该没问题,if/when你遇到了数据库变慢的问题,这很可能是因为查询中有大量的自由文本表达式,然后做一些分析,然后你就可以找到效率。
但我敢打赌上面的代码足以满足您的需求。