如何将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(因为它在一个循环中,不会工作)?

337049 次浏览

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

answers_list = list(answers)

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

你可以这样做:

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)

通过使用带有step参数的切片操作符,这将导致对queryset求值并创建一个列表。

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_list('reqColumn1','reqColumn2')在查询集?< / p >

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

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

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

result = [(value1,value2)]

你可以在这个QuerySet上做所有的操作,就像你对list做的那样。

你可以直接使用list关键字进行转换。 例如:< / p >
obj=emp.objects.all()
list1=list(obj)

使用上面的代码,您可以直接将查询集结果转换为list

这里list是关键字,obj是查询集的结果,而list1是变量,我们将转换的结果存储在list中。

def querySet_to_list(qs):
"""
this will return python list<dict>
"""
return [dict(q) for q in qs]


def get_answer_by_something(request):
ss = Answer.objects.filter(something).values()
querySet_to_list(ss) # python list return.(json-able)

此代码将django queryset转换为python list

试试这个values_list('column_name', flat=True)

answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()]).values_list('column_name', flat=True)

它将返回一个包含指定列值的列表

而不是remove(),你可以使用exclude()函数从查询集中删除一个对象。 它的语法类似于filter()

__abc0: -

qs = qs.exclude(id= 1)

在上面的代码中,它从id为'1'的qs中删除了所有对象

额外的信息: -

filter()用于选择特定的对象,而exclude()用于删除

使用python list()函数

< p >列表()。通过对QuerySet调用list()强制求值。为 例子:< / p >
answers = list(answer_set.answers.all())