如何将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执行所有操作,您可以为列表执行此操作。