从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) 
+0

谢谢!加快了很多。 – 2015-03-19 12:28:17