django - get () hat mehr als ein Thema zurückgegeben
Als ich versuchte zu beziehen, ein Attribut mit einem anderen eine, die hat ein M M Zusammenhang erhielt ich diese Fehlermeldung:
get() zurückgegeben wird mehr als ein Thema -- es wieder 2!
Könnt Ihr mir sagen, was das bedeutet und vielleicht sagen Sie mir im Voraus, wie Sie diesen Fehler vermeiden ?
Modelle
class LearningObjective(models.Model):
learning_objective=models.TextField()
class Topic(models.Model):
learning_objective_topic=models.ManyToManyField(LearningObjective)
topic=models.TextField()
Ausgabe von LearningObjective.objects.all()
[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]
Ausgabe von Topic.objects.all()
[<Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>]
Ansichten
def create_themen(request):
new_topic=Topic(topic=request.POST['topic'])
new_topic.save()
return render(request, 'topic.html', {'topic': topic.objects.all()})
def create_learning_objective(request):
new_learning_objective=LearningObjective(learning_objective=request.POST['learning_objective'])
new_learning_objective.save()
new_learning_objective_topic=Topic.objects.get(topic=request.POST['topic'])
new_learning_objective_topic.new_learning_objective_topic.add(new_learning_objective)
return render( request, 'learning_objective.html', {
'topic': Topic.objects.all(),
'todo': TodoList.objects.all(),
'learning_objective': LearningObjective.objects.all()
})
InformationsquelleAutor der Frage BoJack Horseman | 2014-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem oben genannten Fehler indicatess, dass Sie mehr als einen Datensatz in die DB bezogen auf die spezifischen parameter, die Sie übergeben, während die Abfrage mit get() wie
Zu vermeiden, diese Art von Fehler in der Zukunft, Sie müssen immer eine Abfrage nach Ihren schema-design.
In Ihrem Fall ist Sie entwarf eine Tabelle mit M2M Beziehung, so gibt es natürlich mehrere Datensätze für das Feld und das ist der Grund, warum Sie immer den oben genannten Fehler.
Anstatt also mit
get()
Sie verwenden sollten, filter() die Rückgabe mehrerer Datensätze. WieBitte Lesen Sie, wie Abfragen in django hier.
InformationsquelleAutor der Antwort CrazyGeek
get()
gibt ein einzelnes Objekt. Wenn es kein vorhandenes Objekt zurückgeben, erhalten Sie<class>.DoesNotExist
. Wenn Ihre Abfrage mehr als ein Objekt, dann erhalten SieMultipleObjectsReturned
. Sie können überprüfen, hier für weitere details über die get () - Abfragen.M2M-zurückgegeben wird die Anzahl der Abfrage , mit dem es verknüpft ist. In diesem Fall erhalten Sie keine, eine oder mehrere Positionen mit Ihrer Anfrage.
In Ihre Modelle, Sie können uns Folgendes:
können Sie
_set
zum ausführen einer select-Abfrage auf M2M. In obigem Fall filtern Sie allelearningObjective
s Beziehung zu jedem einzelnen ThemaInformationsquelleAutor der Antwort FallenAngel
In Ihrem
Topic
Modell, das Sie damit für mehr als ein element haben, die gleichetopic
Feld. Sie erstellt haben, zwei mit dem gleichen bereits.Nun, wenn Sie versuchen, um eine neue
learningObjective
Sie scheinen zu wollen, um hinzufügen, dass es nur eineTopic
entspricht, was Sie senden auf dem Formular. Da gibt es mehr als eine mit der gleichentopic
Feldget
zu finden, ist 2, daher die Ausnahme.Können Sie entweder fügen Sie die
learningObjective
zu allen Themen mit, dietopic
Feld:beschränken oder die
Topic
Modell eine einzigartigetopic
Feld und halten mitget
aber dass kann nicht sein, was Sie wollen.InformationsquelleAutor der Antwort Yeray Diaz Diaz
Bekommen soll, zurück, und genau einen Satz, um dies zu beheben, verwenden
filter()
und dann nehmen Sie die erste element der queryset zurückgegeben, um das Objekt, das Sie erwartet hatten, aus erhalten, es wäre auch nützlich, um zu überprüfen, ob mindestens ein Datensatz zurückgegeben wird, bevor Sie mit der Einnahme aus dem ersten element zu vermeidenIndexError
InformationsquelleAutor der Antwort lmc
Hatte ich dasselbe problem und die Lösung war
obj = ClassName.objects.filter()
InformationsquelleAutor der Antwort Nitesh