您可以为此使用itertools.groupby():
import operator
import itertools
from django.db import models
def group_model_by_attr(model_class, attr_name):
assert issubclass(model_class, models.Model), \
"%s is not a Django model." % (model_class,)
assert attr_name in [field.name for field in Event._meta.fields], \
"The %s field doesn't exist on model %s" % (attr_name, model_class)
all_instances = model_class.objects.all().order_by(attr_name)
keyfunc = operator.attrgetter(attr_name)
return [{k: list(g)} for k, g in itertools.groupby(all_instances, keyfunc)]
grouped_by_color = group_model_by_attr(Doggy, 'color')
grouped_by_name = group_model_by_attr(Doggy, 'name')
grouped_by_color(例如)将是像 [{'purple': [doggy1, doggy2], {'pink': [doggy3,]}] 这样的字典列表,其中 doggy1、2 等是 Doggy 实例。
更新:
从您的更新看来,您只需要每个事件类型的 id 列表。我在我的 ubuntu 笔记本电脑上使用 250k 条记录在 postgresql 中测试了这个,带有核心 2 duo 和 3gb 内存,生成字典需要 0.35 秒(itertools.group_by 需要 0.72 秒)。你提到你有 900K 记录,所以这应该足够快。如果不是,它应该很容易随着记录的变化而缓存/更新。
from collections import defaultdict
doggies = Doggy.objects.values_list('color', 'id').order_by('color').iterator()
grouped_doggies_by_color = defaultdict(list)
for color, id in doggies:
grouped_doggies_by_color[color].append(id)