我有以下几点:

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


当前回答

为什么不直接打电话 .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做的那样。

其他回答

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

使用python list()函数

列表()。通过对QuerySet调用list()强制求值。为 例子:

answers = list(answer_set.answers.all())

试试这个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)

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

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

answers_list = list(answers)

这也将计算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)