从Django模型对象列表中过滤对象的最佳方法
问题描述:
我目前正在优化我的一些项目中的代码,并发现一些非常慢的代码。我有一个通过Django查询获得的对象列表。我想过滤这个列表并只返回一个对象,因为这些值是唯一的。从Django模型对象列表中过滤对象的最佳方法
questions = set(Question.object.all())
choices = set(Choice.objects.select_related('question').filter(question__in=questions).all())
for question in questions:
Answer(question=question,
choice=next(filter(lambda x: x.question == question), choices)),
response=response)
其中一些只是伪代码,但真正的问题是在next()函数中。有没有更快的方法来查找一组中的元素?使用列表理解是无可争议的,因为它解析整个列表并返回所有元素。 Filter是一个生成器,next()返回它找到的第一个值。
我使用Django 1.7和Python 3.4
谢谢!
答
我不会在这里使用一个集合,而是使用由问题ID键入的字典。 (请注意,您实际上并不需要此问题,因此您可以删除select_related。)
choice_dict = {c.question_id: c for c in Choice.objects.filter(question__in=questions).all()}
for question in questions:
Answer(question=question,
choice=choice_dict[question.id],
response=response)
谢谢!加快了很多。 – 2015-03-19 12:28:17