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 en un conjunto o lista estándar. 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 llamar
list()
alQueryset
?Esto también evaluará
QuerySet
/ ejecutará la consulta. A continuación, puede eliminar / agregar de esa lista.fuente
set
luego vuelve alist
para obtener los únicos.Es un poco difícil seguir lo que realmente estás tratando de hacer. Parece que su primera declaración puede estar obteniendo exactamente el mismo objeto QuerySet of Answer dos veces. Primero vía
answer_set.answers.all()
y luego de nuevo vía.filter(id__in=...)
. Verifique dos veces el shell y vea si esto le dará la lista de respuestas que está buscando:Una vez que lo hayas limpiado para que sea un poco más fácil para ti (y para otras personas que trabajan en el código) leerlo, es posible que desees examinar .exclude () y la búsqueda de campo __in .
Es posible que la búsqueda anterior no se sincronice 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 identificación, entonces quiere jugar con .values_list () . En su caso, probablemente desee agregar el opcional flat = True.
fuente
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
Gracias !!!!!!!Mediante el uso de un operador de corte con un parámetro de paso que provocaría la evaluación del conjunto de consultas y crearía una lista.
o inicialmente podrías haber hecho:
fuente
Puede convertir directamente usando la
list
palabra clave. Por ejemplo:Aquí
list
está la palabra clave yobj
es el resultado del conjunto de consultas ylist1
es variable en esa variable estamos almacenando el resultado convertido enlist
.fuente
list1 = list(emp.objects.all())
que parece contrario a la intuición.¿Por qué no simplemente llamar
.values('reqColumn1','reqColumn2')
o.values_list('reqColumn1','reqColumn2')
en el conjunto de consultas?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 todas las operaciones en este QuerySet, lo que hace para la lista.
fuente
este código convierte el conjunto de consultas de django a la lista de python
fuente
Prueba esto
values_list('column_name', flat=True)
.Le devolverá una lista con valores de columna especificados
fuente
en lugar de
remove()
puede utilizar laexclude()
función para eliminar un objeto del conjunto de consultas. su sintaxis es similar afilter()
por ejemplo : -
en el código anterior, elimina todos los objetos de qs con id '1'
información adicional : -
filter()
se utiliza para seleccionar objetos específicos pero seexclude()
utiliza para eliminarfuente