我有以下几点:
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 (因为它在一个不起作用的循环中)?
发布于 2010-12-13 06:28:14
为什么不直接在Queryset
上调用list()
呢
answers_list = list(answers)
这也将评估查询的QuerySet
/run。然后,您可以从该列表中删除/添加。
发布于 2010-12-13 13:20:39
要理解你真正想做的事情有点困难。您的第一条语句看起来可能会获取两次相同的Answer对象的QuerySet。首先是通过answer_set.answers.all()
,然后是通过.filter(id__in=...)
。在shell中仔细检查,看看这是否会给出您正在寻找的答案列表:
answers = answer_set.answers.all()
一旦你把它弄清楚了,这样你(和其他从事代码工作的人)就更容易读懂了,你可能会想看看.exclude()和__in field lookup。
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)
发布于 2015-12-02 23:10:47
通过使用带有步骤参数的切片算子,这将导致对查询集进行求值并创建列表。
list_of_answers = answers[::1]
或者一开始你可以这样做:
answers = Answer.objects.filter(id__in=[answer.id for answer in
answer_set.answers.all()])[::1]
https://stackoverflow.com/questions/4424435
复制相似问题