我有以下几点:
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)
要理解你真正想做的事情有点困难。您的第一个语句看起来像是两次获取相同的Answer对象的QuerySet。首先通过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()。在您的情况下,您可能需要添加可选的flat=True。
answers.values_list('id', flat=True)
为什么不直接打电话
.values('reqColumn1','reqColumn2')或.values_list('reqColumn1','reqColumn2') ?
answers_list = models.objects.values(' reqcolumnn1 ','reqColumn2')
result = [{' reqcolumnn1 ':value1,'reqColumn2':value2}]
OR
answers_list = models.objects.values_list(' reqcolumnn1 ','reqColumn2')
结果= [(value1,value2)]
你可以在这个QuerySet上做所有的操作,就像你对list做的那样。