web-dev-qa-db-fra.com

Comment convertir un Django QuerySet en liste

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)?

93
john

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)
_
36
Felix Kling

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.

246
Zeppomedio

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)
27
istruble

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]
13
Ankit Singh

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.

10
patel shahrukh
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

0
EunSeong Lee