首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Django QuerySet转换为列表?

如何将Django QuerySet转换为列表?
EN

Stack Overflow用户
提问于 2010-12-13 06:23:36
回答 6查看 276.1K关注 0票数 174

我有以下几点:

代码语言:javascript
运行
复制
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])

然后:

代码语言:javascript
运行
复制
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)

我得到一个错误:

代码语言:javascript
运行
复制
'QuerySet' object has no attribute 'remove'

我尝试过将QuerySet转换为标准集合或列表的各种方法。毫无办法。

我怎样才能从QuerySet中删除一个项目,这样它就不会从数据库中删除它,也不会返回新的QuerySet (因为它在一个不起作用的循环中)?

EN

回答 6

Stack Overflow用户

发布于 2010-12-13 06:28:14

为什么不直接在Queryset上调用list()

代码语言:javascript
运行
复制
answers_list = list(answers)

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

票数 412
EN

Stack Overflow用户

发布于 2010-12-13 13:20:39

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

代码语言:javascript
运行
复制
answers = answer_set.answers.all()

一旦你把它弄清楚了,这样你(和其他从事代码工作的人)就更容易读懂了,你可能会想看看.exclude()__in field lookup

代码语言:javascript
运行
复制
existing_question_answers = QuestionAnswer.objects.filter(...)

new_answers = answers.exclude(question_answer__in=existing_question_answers)

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

如果您仍然需要获取id值的列表,那么可以使用.values_list()。在您的示例中,您可能希望添加可选的flat=True。

代码语言:javascript
运行
复制
answers.values_list('id', flat=True)
票数 46
EN

Stack Overflow用户

发布于 2015-12-02 23:10:47

通过使用带有步骤参数的切片算子,这将导致对查询集进行求值并创建列表。

代码语言:javascript
运行
复制
list_of_answers = answers[::1]

或者一开始你可以这样做:

代码语言:javascript
运行
复制
answers = Answer.objects.filter(id__in=[answer.id for answer in
        answer_set.answers.all()])[::1]
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4424435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档