Как преобразовать 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 в стандартный набор или список. Ничего не работает.
как я могу удалить элемент из набора запросов, чтобы он не удалял его из базы данных и не возвращал новый набор запросов (поскольку он находится в цикле, который не будет работать)?
6 ответов:
вы могли бы сделать это:
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)
почему бы просто не вызвать list () на queryset?
answers_list = list(answers)Это также будет оценивать QuerySet / выполнить запрос. Затем вы можете удалить/добавить из этого списка.
это немного трудно следить за тем, что вы действительно пытаетесь сделать. Ваше первое утверждение выглядит так, как будто вы можете получить один и тот же точный набор объектов ответа дважды. Сначала через
answer_set.answers.all()а потом снова через.filter(id__in=...). Дважды проверьте в оболочке и посмотреть, если это даст вам список ответов, которые вы ищете:answers = answer_set.answers.all()как только вы это очистили, так что вам немного легче (и другим, работающим над кодом) читать, вы можете захотеть посмотреть .исключить() и _ _ 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)
С помощью оператора slice с параметром 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')на queryset?
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ключевое слово. Например:obj=emp.objects.all() list1=list(obj)используя приведенный выше код, вы можете напрямую преобразовать результат набора запросов в
list.здесь
listключевое слово иobjявляется результатом набора запросов иlist1переменная в этой переменной мы храним преобразованный результат, который вlist.
Comments