Как преобразовать 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 в стандартный набор или список. Ничего не работает.



как я могу удалить элемент из набора запросов, чтобы он не удалял его из базы данных и не возвращал новый набор запросов (поскольку он находится в цикле, который не будет работать)?

1956   6  

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

    Ничего не найдено.