Python 在django中创建查询集列表的最佳方法是什么?

Python 在django中创建查询集列表的最佳方法是什么?,python,django,Python,Django,我有一个模型类“Place”,它有一个“state”字段,我想得到一个查询集列表,该列表按数据库中所有可用的不同状态分组 我目前正在这样做: place_list = [] places = Place.objects.distinct('state') [place_list.append( Place.objects.filter(state=p.state) ) for p in places] 我是否可以使用更好的聚合命令来优化它?最好的方法是什么 ~使用Python 2.6、Djan

我有一个模型类“Place”,它有一个“state”字段,我想得到一个查询集列表,该列表按数据库中所有可用的不同状态分组

我目前正在这样做:

place_list = []
places = Place.objects.distinct('state')
[place_list.append( Place.objects.filter(state=p.state) ) for p in places]
我是否可以使用更好的聚合命令来优化它?最好的方法是什么


~使用Python 2.6、Django 1.3.1时,您没有正确使用列表。列表理解不是为了重复动作,而是为了创建列表。这就是我要做的:

places = Place.objects.distinct('state')
place_list = [Place.objects.filter(state=p.state) for p in places]

这和你以前做的一样,但我只是正确地使用了列表理解。

你没有正确地使用列表理解。列表理解不是为了重复动作,而是为了创建列表。这就是我要做的:

places = Place.objects.distinct('state')
place_list = [Place.objects.filter(state=p.state) for p in places]
from collections import defaultdict

places_by_state = defaultdict(list)
for place in Place.objects.all():
   places_by_state[place.state].append(place)
list_of_places_by_state = places_by_state.values()
这和你以前做的一样,但我只是正确地使用了列表理解

from collections import defaultdict

places_by_state = defaultdict(list)
for place in Place.objects.all():
   places_by_state[place.state].append(place)
list_of_places_by_state = places_by_state.values()
这只会在数据库中点击一次,而不是像原始版本那样在每个状态下点击一次(假设您使用了所有结果),但最终会得到一个列表列表,而不是查询集列表


这只会在数据库中点击一次,而不是像原始版本那样在每个状态下点击一次(假设您使用了所有结果),但最终会得到一个列表列表,而不是查询集列表。

如何只获取状态的值(这是一个方便的工具):

然后对每个状态执行您正在执行的操作,但使用您的结果并跳过.append()调用

这仍然会命中状态的DB计数+1次,但您只在开始时执行状态查询。
place\u list
中的QuerySet对象仍然是惰性的,在使用它们之前不会得到计算


注意:@pastylegs关于在模板中使用模板标记的评论可能是我们中任何人所说的最有见地的事情。我的回答实际上只是向您展示了
value\u list
和列表理解。

您如何获得状态的值(这里是一个方便的工具):

然后对每个状态执行您正在执行的操作,但使用您的结果并跳过.append()调用

这仍然会命中状态的DB计数+1次,但您只在开始时执行状态查询。
place\u list
中的QuerySet对象仍然是惰性的,在使用它们之前不会得到计算


注意:@pastylegs关于在模板中使用模板标记的评论可能是我们中任何人所说的最有见地的事情。我的回答实际上只是向您展示
value\u list
和列表理解。

如果您计划在模板级别显示这些内容,您可以使用
重新组合
标记:谢谢pastylegs!!如果您计划在模板级别显示这些内容,则可以使用
regroups
标记:谢谢pastylegs!!这很有用在django中创建查询集列表的最佳方法是什么?我在这里看不到查询集的列表。。@julio.alegria很好的观点——现在有一个列表。如果您确实想要queryset对象而不是列表,您的/当然是正确的方式。我认为您应该将其更改为
places\u by_state[place.state]。append(place)
谢谢@Dougal。我仍然喜欢你的答案,因为它展示了一种减少DB点击的方法。我们的答案优化了一些不同的东西。@priyeshj小心不要过早优化。可读性和可维护性非常重要。按照最容易理解的方法去做,直到你知道你需要更出色一点。在django中创建查询集列表的最佳方法是什么?我在这里看不到查询集的列表。。@julio.alegria很好的观点——现在有一个列表。如果您确实想要queryset对象而不是列表,您的/当然是正确的方式。我认为您应该将其更改为
places\u by_state[place.state]。append(place)
谢谢@Dougal。我仍然喜欢你的答案,因为它展示了一种减少DB点击的方法。我们的答案优化了一些不同的东西。@priyeshj小心不要过早优化。可读性和可维护性非常重要。去做最容易理解的事情,直到你知道你需要表现得更好一点。谢谢你!这对我有用。从itThanks istruble的外观来看,重组也是一个非常方便的工具!这对我有用。从外观上看,重组也是一个非常方便的工具