Der betreffende Fehler wird verursacht, wenn Sie versuchen, Manager
über eine Instanz des Modells auf das Modell zuzugreifen . Sie haben Klassennamen in Kleinbuchstaben verwendet. Dies macht es schwierig zu sagen, ob der Fehler durch eine Instanz verursacht wird, die auf die zugreift Manager
oder nicht. Da andere Szenarien, die diesen Fehler verursachen können, unbekannt sind, gehe ich davon aus, dass Sie die topic
Variable irgendwie verwechselt haben , sodass Sie am Ende auf eine Instanz des topic
Modells anstatt auf die Klasse verweisen .
Diese Linie ist der Schuldige:
forum.topic_count = topic.objects.filter(forum = forum).count()
Sie müssen verwenden:
forum.topic_count = Topic.objects.filter(forum = forum).count()
Was läuft falsch? objects
ist Manager
auf Klassenebene verfügbar, nicht für die Instanzen. Weitere Informationen finden Sie in der Dokumentation zum Abrufen von Objekten . Geldzitat:
Managers
sind nur über Modellklassen und nicht über Modellinstanzen zugänglich , um eine Trennung zwischen Operationen auf Tabellenebene und Operationen auf Datensatzebene zu erzwingen.
(Betonung hinzugefügt)
Aktualisieren
Siehe die Kommentare von @Daniel unten. Es ist eine gute Idee (nein, Sie MÜSSEN: P), die Groß- und Kleinschreibung für Klassennamen zu verwenden. Zum Beispiel Topic
statt topic
. Ihre Klassennamen führen zu Verwirrung, unabhängig davon, ob Sie sich auf eine Instanz oder eine Klasse beziehen. Da das Manager isn't accessible via <model> instances
sehr spezifisch ist, kann ich eine Lösung anbieten. Der Fehler ist möglicherweise nicht immer so selbstverständlich.
topic
scheint jedoch die tatsächliche Modellklasse zu sein und keine Instanz gemäß dem von ihm bereitgestellten Code.Manager isn't accessible via Foo instances
ist jedoch nur möglich, wenn Sie versuchen,Manager
mithilfe einer Instanz auf eine zuzugreifen . Siehe den Quellcode: code.djangoproject.com/svn/django/trunk/django/db/models/…topic
als lokale Instanzvariable verwendet und den Verweis auf die Klasse wegbläst.topic.model_class().objects
topic.__class__.objects
. Es scheintmodel_class()
von @Nimo oben erwähnt zu scheinen , funktioniert nichttopic.__class__.objects.get(id=topic_id)
quelle
__class__
funktioniert auch besser für Methoden in abstrakten Modellen, da wir den tatsächlichen Namen der Nachkommenklasse nicht kennen. In dieser Situation habe ichself.__class__.objects.get
Für Django <1.10
topic._default_manager.get(id=topic_id)
Obwohl Sie es nicht so verwenden sollten. Der _default_manager und der _base_manager sind privat. Es wird daher empfohlen, sie nur zu verwenden, wenn Sie sich im Topic-Modell befinden, z. B. wenn Sie den Manager in einer proprietären Funktion verwenden möchten.
class Topic(Model): . . . def related(self) "Returns the topics with similar starting names" return self._default_manager.filter(name__startswith=self.name) topic.related() #topic 'Milan wins' is related to: # ['Milan wins','Milan wins championship', 'Milan wins by one goal', ...]
quelle
topic.__class__.objects.get(id=topic_id)
.self.__class__.objects
macht der Trick nach Ihrer anderen Antwort.Könnte auch durch ein Paar zu viele Klammern verursacht werden, z
ModelClass().objects.filter(...)
statt der richtigen
ModelClass.objects.filter(...)
Passiert mir manchmal, wenn bpython (oder eine IDE) automatisch Klammern hinzufügt.
Das Ergebnis ist natürlich dasselbe - Sie haben eine Instanz anstelle einer Klasse.
quelle
Wenn das Thema eine ContentType-Instanz wäre (was nicht der Fall ist), hätte dies funktioniert:
topic.model_class().objects.filter(forum = forum)
quelle
model_class()
ist eine Methode desContentType
Modells. Andere Modellinstanzen, einschließlichtopic
, haben keinemodel_class
Methode.Ich hatte gerade ein ähnliches Problem wie dieser Fehler. Und wenn Sie auf Ihren Code zurückblicken, scheint es, dass dies auch Ihr Problem sein könnte. Ich denke, Ihr Problem ist, dass Ihr Vergleich von "id" mit "int (topic_id)" und topic_id nicht festgelegt ist.
def test(request, post_id): post = topic.objects.get(id = int(topic_id)) post.delete()
Ich vermute, Ihr Code sollte "post_id" und nicht "topic_id" verwenden.
def test(request, post_id): post = topic.objects.get(id = int(post_id)) post.delete()
quelle