Eu tenho o seguinte:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
então mais tarde:
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)
Recebo um erro:
'QuerySet' object has no attribute 'remove'
Tentei todos os tipos para converter o QuerySet em um conjunto ou lista padrão. Nada funciona.
Como posso remover um item do QuerySet para que ele não o exclua do banco de dados e não retorne um novo QuerySet (já que está em um loop que não funciona)?
Por que não ligar
list()
para oQueryset
?Isso também avaliará
QuerySet
/ execute a consulta. Você pode então remover / adicionar dessa lista.fonte
set
e depois volte paralist
para obter os únicos.É um pouco difícil seguir o que você realmente está tentando fazer. Sua primeira instrução parece que você está buscando os mesmos objetos QuerySet of Answer duas vezes. Primeiro via
answer_set.answers.all()
e depois novamente via.filter(id__in=...)
. Verifique novamente o shell e veja se isso lhe dará a lista de respostas que você está procurando:Depois de limpar isso para que seja um pouco mais fácil para você (e outros que estão trabalhando no código) ler, você pode dar uma olhada em .exclude () e no campo __in .
A pesquisa acima pode não sincronizar com as definições do seu modelo, mas provavelmente o deixará perto o suficiente para terminar o trabalho sozinho.
Se você ainda precisa obter uma lista de valores de id, então você deseja brincar com .values_list () . No seu caso, você provavelmente desejará adicionar o opcional flat = True.
fonte
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
Obrigado !!!!!!!Pelo uso do operador slice com o parâmetro step que causaria avaliação do queryset e criaria uma lista.
ou inicialmente você poderia ter feito:
fonte
Você pode converter diretamente usando a
list
palavra - chave. Por exemplo:Aqui
list
está a palavra-chave eobj
é o resultado do conjunto de consultas elist1
é variável nessa variável em que estamos armazenando o resultado convertido emlist
.fonte
list1 = list(emp.objects.all())
que parece contra-intuitivo.Por que não ligar
.values('reqColumn1','reqColumn2')
ou.values_list('reqColumn1','reqColumn2')
no queryset?answers_list = models.objects.values('reqColumn1','reqColumn2')
result = [{'reqColumn1':value1,'reqColumn2':value2}]
OU
answers_list = models.objects.values_list('reqColumn1','reqColumn2')
result = [(value1,value2)]
Você pode fazer todas as operações neste QuerySet, que você faz para a lista.
fonte
este código converte django queryset em lista python
fonte
Experimente isso
values_list('column_name', flat=True)
.Irá devolver-lhe uma lista com valores de coluna especificados
fonte
em vez de
remove()
você pode usar aexclude()
função para remover um objeto do queryset. sua sintaxe é semelhante afilter()
por exemplo : -
no código acima, ele remove todos os objetos de qs com id '1'
informações adicionais : -
filter()
usado para selecionar objetos específicos, masexclude()
usado para removerfonte