example - Cómo convertir un Django QuerySet a una lista
queryset django (6)
Tengo lo siguiente:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
Entonces despúes:
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)
Me sale un error:
''QuerySet'' object has no attribute ''remove''
He intentado todo tipo de convertir el QuerySet a un conjunto estándar o lista. Nada funciona.
¿Cómo puedo eliminar un elemento del QuerySet para que no lo elimine de la base de datos y no devuelva un nuevo QuerySet (ya que está en un bucle que no funcionará)?
¿Por qué no simplemente llamar .values(''reqColumn1'',''reqColumn2'')
o .values_list(''reqColumn1'',''reqColumn2'')
en el queryset?
answers_list = models.objects.values(''reqColumn1'',''reqColumn2'')
result = [{''reqColumn1'':value1,''reqColumn2'':value2}]
O
answers_list = models.objects.values_list(''reqColumn1'',''reqColumn2'')
result = [(value1,value2)]
Puede hacer toda la operación en este QuerySet, lo cual hace para la lista.
¿Por qué no simplemente llamar a list () en el queryset?
answers_list = list(answers)
Esto también evaluará el QuerySet / ejecutará la consulta. Luego puede eliminar / agregar de esa lista.
Es un poco difícil seguir lo que realmente estás tratando de hacer. Su primera afirmación parece que puede obtener dos veces el mismo objeto QuerySet de Answer. Primero a través de answer_set.answers.all()
y luego nuevamente a través de .filter(id__in=...)
. Revise el casillero y vea si esto le dará la lista de respuestas que está buscando:
answers = answer_set.answers.all()
Una vez que haya limpiado eso para que sea más fácil para usted (y para otros que trabajan en el código) leer, es posible que desee buscar en .exclude() y en la búsqueda de campo __in .
existing_question_answers = QuestionAnswer.objects.filter(...)
new_answers = answers.exclude(question_answer__in=existing_question_answers)
La búsqueda anterior puede no sincronizarse con las definiciones de su modelo, pero probablemente lo acercará lo suficiente como para terminar el trabajo usted mismo.
Si aún necesita obtener una lista de valores de id, entonces quiere jugar con .values_list() . En su caso, es probable que desee agregar el plano opcional = Verdadero.
answers.values_list(''id'', flat=True)
Mediante el uso de un operador de división con un parámetro de paso que provocaría la evaluación del conjunto de consulta y crearía una lista.
list_of_answers = answers[::1]
o inicialmente podrías haberlo hecho:
answers = Answer.objects.filter(id__in=[answer.id for answer in
answer_set.answers.all()])[::1]
Podrías hacer esto:
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)
Lea cuando se evalúan los QuerySets y tenga en cuenta que no es bueno cargar todo el resultado en la memoria (por ejemplo, a través de list()
).
Referencia: itertools.ifilter
Actualización con respecto al comentario:
Hay varias maneras de hacer esto. Uno (que probablemente no sea el mejor en términos de memoria y tiempo) es hacer exactamente lo mismo:
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)
Puede convertir directamente usando la palabra clave list
. Por ejemplo:
obj=emp.objects.all()
list1=list(obj)
Usando el código anterior, puede convertir directamente un resultado del conjunto de consultas en una
list
.
Aquí la list
es palabra clave y obj
es el resultado del conjunto de consultas y la list1
es variable en esa variable. Estamos almacenando el resultado convertido que está en la list
.