J'ai ce qui suit:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
puis plus tard:
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)
J'obtiens une erreur:
'QuerySet' object has no attribute 'remove'
J'ai essayé toutes sortes de convertir le QuerySet en un ensemble ou une liste standard. Rien ne fonctionne.
Comment puis-je supprimer un élément du QuerySet afin qu'il ne le supprime pas de la base de données et ne renvoie pas un nouveau QuerySet (car il est dans une boucle qui ne fonctionnera pas)?
Pourquoi ne pas simplement appeler
list()
leQueryset
?Cela évaluera également
QuerySet
/ exécutera la requête. Vous pouvez ensuite supprimer / ajouter de cette liste.la source
set
et revenez verslist
pour obtenir les éléments uniques.Il est un peu difficile de suivre ce que vous essayez vraiment de faire. Votre première déclaration semble que vous récupérez peut-être deux fois exactement les mêmes objets QuerySet of Answer. D'abord via
answer_set.answers.all()
, puis de nouveau via.filter(id__in=...)
. Vérifiez à nouveau dans le shell et voyez si cela vous donnera la liste des réponses que vous recherchez:Une fois que vous avez nettoyé cela afin qu'il soit un peu plus facile pour vous (et pour les autres personnes travaillant sur le code) de lire, vous voudrez peut-être regarder dans .exclude () et la recherche dans le champ __in .
La recherche ci-dessus peut ne pas se synchroniser avec vos définitions de modèle, mais elle vous rapprochera probablement suffisamment pour terminer le travail vous-même.
Si vous avez encore besoin d'obtenir une liste de valeurs d'identifiant, vous voulez jouer avec .values_list () . Dans votre cas, vous voudrez probablement ajouter l'option flat = True.
la source
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
Merci !!!!!!!Par l'utilisation d'un opérateur de tranche avec un paramètre d'étape qui provoquerait l'évaluation de l'ensemble de requêtes et créerait une liste.
ou au départ vous auriez pu faire:
la source
Vous pouvez convertir directement en utilisant le
list
mot - clé. Par exemple:Voici le
list
mot-clé etobj
est le résultat de l'ensemble de requêtes etlist1
est variable dans cette variable, nous stockons le résultat converti danslist
.la source
list1 = list(emp.objects.all())
ce qui semble contre-intuitif.Pourquoi ne pas simplement appeler
.values('reqColumn1','reqColumn2')
ou.values_list('reqColumn1','reqColumn2')
sur le jeu de requêtes?answers_list = models.objects.values('reqColumn1','reqColumn2')
result = [{'reqColumn1':value1,'reqColumn2':value2}]
OU
answers_list = models.objects.values_list('reqColumn1','reqColumn2')
result = [(value1,value2)]
Vous pouvez effectuer toutes les opérations sur ce QuerySet, ce que vous faites pour la liste.
la source
ce code convertit le jeu de requêtes django en liste python
la source
Essayez ceci
values_list('column_name', flat=True)
.Il vous renverra une liste avec des valeurs de colonne spécifiées
la source
au lieu de
remove()
vous, vous pouvez utiliser laexclude()
fonction pour supprimer un objet du jeu de requêtes. sa syntaxe est similaire àfilter()
par exemple : -
dans le code ci-dessus, il supprime tous les objets de qs avec l'ID '1'
info supplémentaire : -
filter()
utilisé pour sélectionner des objets spécifiques maisexclude()
utilisé pour supprimerla source