1. ホーム
  2. django

[解決済み】DjangoのQuerySetをリストに変換する方法とは?

2022-02-22 06:02:39

質問

次のようなものがあります。

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)

読む クエリセットが評価されたとき で、結果全体をメモリに読み込むのは良くないことに注意してください。 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)