J'ai le suivant:
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)
Je reçois une erreur:
'QuerySet' object has no attribute 'remove'
J'ai essayé toutes sortes de convertir le QuerySet en un ensemble standard ou une liste. 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 (puisqu'il est dans une boucle qui ne fonctionne pas)?
Vous pourriez faire ceci:
_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)
_
Lisez lorsque les QuerySets sont évalués et notez qu'il n'est pas bon de charger le résultat entier dans la mémoire (par exemple via list()
).
Référence: itertools.ifilter
Mise à jour en ce qui concerne le commentaire:
Il ya différentes manière de faire ceci. L'une (qui n'est probablement pas la meilleure en termes de mémoire et de temps) consiste à faire exactement la même chose:
_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)
_
Pourquoi ne pas simplement appeler list () sur le queryset?
answers_list = list(answers)
Cela évaluera également le QuerySet/exécutera la requête. Vous pouvez ensuite supprimer/ajouter de cette liste.
Il est un peu difficile de suivre ce que vous essayez vraiment de faire. Votre première instruction donne à penser que vous récupérerez peut-être deux fois le même objet QuerySet of Answer. D'abord via answer_set.answers.all()
, puis à nouveau via .filter(id__in=...)
. Vérifiez dans le shell et voyez si cela vous donnera la liste des réponses que vous recherchez:
answers = answer_set.answers.all()
Une fois que tout est nettoyé, il est un peu plus facile pour vous (et les autres personnes travaillant sur le code) de lire de lire les informations sur .exclude () et le __inrecherche de champ .
existing_question_answers = QuestionAnswer.objects.filter(...)
new_answers = answers.exclude(question_answer__in=existing_question_answers)
La recherche ci-dessus peut ne pas être synchronisée avec les définitions de votre modèle, mais elle vous rapprochera probablement suffisamment pour que vous puissiez terminer le travail vous-même.
Si vous devez toujours obtenir une liste de valeurs id, vous voulez jouer avec .values_list () . Dans votre cas, vous voudrez probablement ajouter l'option optionnelle flat = True.
answers.values_list('id', flat=True)
En utilisant l'opérateur slice avec le paramètre step qui provoquerait l'évaluation du queryset et créerait une liste.
list_of_answers = answers[::1]
ou au début vous auriez pu faire:
answers = Answer.objects.filter(id__in=[answer.id for answer in
answer_set.answers.all()])[::1]
Vous pouvez convertir directement à l'aide du mot clé list
..____. Par exemple:
obj=emp.objects.all()
list1=list(obj)
En utilisant le code ci-dessus, vous pouvez convertir directement un résultat de jeu de requêtes en un
list
.
Ici, list
est un mot clé et obj
est le résultat du jeu de requêtes et list1
est une variable dans cette variable, nous stockons le résultat converti qui dans list
.
def querySet_to_list(qs):
"""
this will return python list<dict>
"""
return [dict(q) for q in qs]
def get_answer_by_something(request):
ss = Answer.objects.filter(something).values()
querySet_to_list(ss) # python list return.(json-able)
ce code convertit Django queryset en liste python