从django模型对象列表中过滤对象的最佳方法

时间:2015-03-19 11:19:11

标签: python 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

谢谢!

1 个答案:

答案 0 :(得分:1)

我不会在这里使用集合,而是使用由问题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)