Ich habe folgendes:
answers = Answer.objects.filter(id__in=[answer.id for answer in answer_set.answers.all()])
dann später:
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)
Ich erhalte eine Fehlermeldung:
'QuerySet' object has no attribute 'remove'
Ich habe alle möglichen Versuche unternommen, das QuerySet in einen Standardsatz oder eine Standardliste zu konvertieren. Nichts funktioniert.
Wie kann ich ein Element aus dem QuerySet entfernen, damit es nicht aus der Datenbank gelöscht wird und kein neues QuerySet zurückgibt (da es sich in einer Schleife befindet, die nicht funktioniert)?
Warum nicht einfach anrufen
list()
auf dasQueryset
?Dadurch wird auch
QuerySet
die Abfrage ausgewertet . Sie können diese Liste dann entfernen / hinzufügen.quelle
set
und dann zurücklist
, um die einzigartigen zu erhalten.Es ist ein wenig schwierig zu verfolgen, was Sie wirklich versuchen zu tun. Ihre erste Anweisung sieht so aus, als würden Sie möglicherweise zweimal genau dasselbe QuerySet of Answer-Objekt abrufen. Erst über
answer_set.answers.all()
und dann wieder über.filter(id__in=...)
. Überprüfen Sie die Shell noch einmal und prüfen Sie, ob Sie dadurch die Liste der Antworten erhalten, nach denen Sie suchen:Sobald Sie, dass aufgeräumt , so dass es ein wenig einfacher ist für Sie (und andere auf dem Code arbeiten) möchten Sie vielleicht prüfen, lesen .exclude () und die __in Feld Lookup .
Die obige Suche wird möglicherweise nicht mit Ihren Modelldefinitionen synchronisiert, bringt Sie jedoch wahrscheinlich nahe genug heran, um den Auftrag selbst abzuschließen.
Wenn Sie immer noch eine Liste mit ID-Werten benötigen, möchten Sie mit .values_list () spielen . In Ihrem Fall möchten Sie wahrscheinlich die optionale Ebene = True hinzufügen.
quelle
new_answers = answers.exclude(question_answer__in=existing_question_answers.values_list('id', flat=True))
@istrubleflat=True
Danke !!!!!!!Durch die Verwendung eines Slice-Operators mit Schrittparameter, der eine Auswertung des Abfragesatzes bewirken und eine Liste erstellen würde.
oder anfangs hättest du tun können:
quelle
Sie können direkt mit dem
list
Schlüsselwort konvertieren . Beispielsweise:Hier
list
ist das Schlüsselwort undobj
das Ergebnis des Abfragesatzes undlist1
die Variable in der Variablen, in der das konvertierte Ergebnis gespeichert wirdlist
.quelle
list1 = list(emp.objects.all())
scheint nicht intuitiv zu sein.Warum nicht einfach anrufen
.values('reqColumn1','reqColumn2')
oder.values_list('reqColumn1','reqColumn2')
auf dem Queryset?answers_list = models.objects.values('reqColumn1','reqColumn2')
result = [{'reqColumn1':value1,'reqColumn2':value2}]
ODER
answers_list = models.objects.values_list('reqColumn1','reqColumn2')
result = [(value1,value2)]
Sie können alle Vorgänge für dieses QuerySet ausführen, die Sie für die Liste ausführen.
quelle
Dieser Code konvertiert Django-Abfrageset in Python-Liste
quelle
Versuchen Sie dies
values_list('column_name', flat=True)
.Sie erhalten eine Liste mit den angegebenen Spaltenwerten
quelle
Stattdessen
remove()
können Sie dieexclude()
Funktion verwenden, um ein Objekt aus dem Abfragesatz zu entfernen. Die Syntax ist ähnlich wiefilter()
zB : -
im obigen Code werden alle Objekte mit der ID '1' aus qs entfernt.
zusätzliche Infos : -
filter()
Dient zum Auswählen bestimmter Objekte,exclude()
wird jedoch zum Entfernen verwendetquelle