2017-10-10 3 views
-1

Ich muss ein Objekt von einem Modell abfragen, dieses Objekt heißt "Übung" und hat viele Felder (Titel, Körper, Antworten usw.) Ich muss "Übungsobjekte" bekommen eins nach dem anderen mit allen ihren Feldern, mach ein Rendering darauf und gib als Ergebnis ein PDF der Übung zurück.Django wie Objekte nacheinander abgefragt werden

Das Problem ist, wenn ich es tue:

exercises = ExerciseModel.objects.all() 

ich alle von ihnen zu bekommen. Wenn ich das tue:

some_exercises = ExerciseModel.objects.filter(something=something) 

Ich bekomme "einige von ihnen" je nach Filter. Und wenn ich tun:

exercise = ExerciseModel.objects.get() 

ich

Fehler get() zurückgegeben mehr als eine Übung

Wie kann ich sie eins nach dem anderen bekommen? Ich muss sie als Eingabe für eine andere Funktion verwenden können.

+3

Warum können Sie nicht durch die "alle" oder "einige" iterieren? –

+0

Da es 30.000 Übungen gibt und ich kann nicht 30000 pdf jedes Mal zurückgeben, muss ich eine einzige willkürliche Übung bekommen und Operationen nur darauf ausführen – JungleFever

+1

Um eine einzelne Instanz zu erhalten, müssen Sie tatsächlich einige Kriterien, zB den Primärschlüssel, an 'übergeben get() '. –

Antwort

-1

.get() müssen ein einzelnes Objekt und keine QuerySet-Instanz zurückgeben. Wenn Sie eine einzelne Übung erhalten möchten, müssen Sie einen Parameter an die .get Instanz übergeben. Zum Beispiel würde ein Objekt mit Namen Abrufen benötigen Sie den folgenden Code:

exercise = ExerciseModel.objects.get(name="an_exercise")

Wenn Sie durch alle Objekte zu durchlaufen wollen, ohne tatsächlich eine QuerySet Abrufen der Objekte enthält, können Sie den folgenden Code verwenden:

1

Wenn Sie die Aufgabe nur für 1 Übung ausführen müssen, verwenden Sie stattdessen get(). In diesem Fall benötigen Sie ein Kriterium, um sicherzustellen, dass get() 1 und nur 1 Ergebnis zurückgibt.

Beispiel:

ex = ExerciseModel.objects.get(pk=123) 

Vom doc:

Gibt das Objekt, um die gegebenen Lookup Parametern entsprechen, die in dem Format in Field-Lookups beschrieben sein sollte.

get() löst MultipleObjectsReturned aus, wenn mehr als ein Objekt gefunden wurde. Die Ausnahme MultipleObjectsReturned ist ein Attribut der Modellklasse.

get() wirft eine DoesNotExis t Ausnahme, wenn ein Objekt nicht für die gegebenen Parameter gefunden wurde. Diese Ausnahme ist ein Attribut der Modellklasse.

Wenn Sie eine QuerySet mit Filtern, die die zugrunde liegende SQL sicherstellt, dass nur 1 Zeile zurückkehren, können Sie get() ohne Argument auf der QuerySet nennen. Dadurch wird die Zeile als Modellinstanz zurückgegeben und nicht als Liste mit 1 Element zurückgegeben.

Ursprüngliche Antwort:

Beide filter() und all() Methoden liefern eine QuerySet Instanz. Darauf können Sie sich iterieren eine Aufgabe für jeden „Übung“ durch Ihre Anfrage

for exercise in ExerciseModel.objects.filter(something=something): 
    # ... do what you need on your exercise 

Vom documentation zurückführen:

A QuerySet ist iterable, und es führt seine Datenbankabfrage beim ersten Mal iteriere darüber.Zum Beispiel druckt diese die Überschrift aller Einträge in der Datenbank

0

Was Sie brauchen, ist .iterator(), die eine queryset zu einem Iterator verwandeln:

exercises = ExerciseModel.objects.all().iterator() 

dann Sie iterieren es in einem bekommen für Schleife:

for exercise in exercises: 
    ... 

Diese Leistung verbessern, wenn Sie große Anzahl von Elementen haben. Allerdings hat es einige Nachteile sowie die in der docs

angegebenen Hoffnung, es hilft!

+0

Zunächst einmal danke für Hilfe, ich versuchte es schon, aber es funktionierte nicht gut, weil ich einen "Pool" von 30k + Übungen habe und ich muss eine willkürliche Übung bekommen und nicht alle von ihnen eins nach dem anderen, mein Schlechter, vielleicht ist die Frage nicht so klar – JungleFever

Verwandte Themen