如何将Django QuerySet转换为列表

我有以下几点:

answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()]) 

那么稍后:

 for i in range(len(answers)): # iterate through all existing QuestionAnswer objects for existing_question_answer in existing_question_answers: # if an answer is already associated, remove it from the # list of answers to save if answers[i].id == existing_question_answer.answer.id: answers.remove(answers[i]) # doesn't work existing_question_answers.remove(existing_question_answer) 

我收到一个错误:

 'QuerySet' object has no attribute 'remove' 

我已经尝试了各种将QuerySet转换为标准集或列表。 没有任何工作

如何从QuerySet中删除一个项目,以便它不会从数据库中删除它,并且不会返回一个新的QuerySet(因为它在循环中不起作用)?

你可以这样做:

 import itertools ids = set(existing_answer.answer.id for existing_answer in existing_question_answers) answers = itertools.ifilter(lambda x: x.id not in ids, answers) 

当QuerySets被评估时读取并注意到将整个结果加载到内存中是不好的(例如通过list() )。

参考: itertools.ifilter

关于评论的更新

有很多种方法可以做到这一点。 其中一个(在内存和时间上可能不是最好的)是完全一样的:

 answer_ids = set(answer.id for answer in answers) existing_question_answers = filter(lambda x: x.answer.id not in answers_id, existing_question_answers) 

为什么不直接调用queryset上的list()呢?

 answers_list = list(answers) 

这也将评估QuerySet /运行查询。 然后您可以从该列表中删除/添加。

遵循你真正想做的事情是有点困难的。 您的第一条语句看起来像您可能会两次获取相同的Answer对象。 先通过answer_set.answers.all() ,然后再通过.filter(id__in=...) 。 仔细检查shell,看看这会给你你正在寻找答案的列表:

 answers = answer_set.answers.all() 

一旦你清理完了,所以你(和其他人在编写代码的时候)读起来更容易一些。你可能想看看.exclude()和__in 字段查找 。

 existing_question_answers = QuestionAnswer.objects.filter(...) new_answers = answers.exclude(question_answer__in=existing_question_answers) 

上面的查找可能不会与你的模型定义同步,但它可能会让你足够接近自己完成工作。

如果你仍然需要得到一个id值列表,那么你想要使用.values_list() 。 在你的情况下,你可能会想要添加可选的平坦=真。

 answers.values_list('id', flat=True) 

通过使用带有步骤参数的切片运算符,这将导致查询集的评估并创build列表。

 list_of_answers = answers[::1] 

或者最初你可以做到:

 answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])[::1] 

为什么不在.values('reqColumn1','reqColumn2')调用.values('reqColumn1','reqColumn2').values_list('reqColumn1','reqColumn2')

answers_list = models.objects.values('reqColumn1','reqColumn2')

result = [{'reqColumn1':value1,'reqColumn2':value2}]

要么

answers_list = models.objects.values_list('reqColumn1','reqColumn2')

result = [(value1,value2)]

您可以对此QuerySet执行所有操作,您可以为列表执行此操作。