El error en cuestión se produce cuando intenta acceder al Manager
de un modelo a través de una instancia del modelo. Ha utilizado nombres de clases en minúsculas . Esto hace que sea difícil decir si el error es causado por una instancia que accede Manager
o no. Dado que se desconocen otros escenarios que pueden causar este error, procedo asumiendo que de alguna manera ha mezclado la topic
variable para que termine apuntando a una instancia del topic
modelo en lugar de la clase.
Esta línea es la culpable:
forum.topic_count = topic.objects.filter(forum = forum).count()
Tienes que usar:
forum.topic_count = Topic.objects.filter(forum = forum).count()
¿Qué va mal? objects
está Manager
disponible a nivel de clase, no para las instancias. Consulte la documentación para recuperar objetos para obtener más detalles. Cotización de dinero:
Managers
son accesibles solo a través de clases de modelo, en lugar de instancias de modelo, para imponer una separación entre las operaciones de "nivel de tabla" y las operaciones de "nivel de registro".
(Énfasis añadido)
Actualizar
Vea los comentarios de @Daniel a continuación. Es una buena idea (no, DEBE: P) usar mayúsculas y minúsculas para los nombres de las clases. Por ejemplo, en Topic
lugar de topic
. Los nombres de sus clases causan cierta confusión ya sea que se refiera a una instancia o una clase. Dado que el Manager isn't accessible via <model> instances
es muy específico, puedo ofrecer una solución. El error puede no ser tan evidente siempre.
topic
parece ser la clase de modelo real, y no una instancia según el código que proporcionó.Manager isn't accessible via Foo instances
solo es posible cuando intentas acceder aManager
una instancia. Vea el código fuente: code.djangoproject.com/svn/django/trunk/django/db/models/…topic
como una variable de instancia local y eliminando la referencia a la clase.topic.model_class().objects
topic.__class__.objects
. Parece que lomodel_class()
mencionado por @Nimo arriba no funcionatopic.__class__.objects.get(id=topic_id)
fuente
__class__
funciona mejor para métodos dentro de modelos abstractos, ya que no conocemos el nombre real de la clase descendiente. En esta situación, he usadoself.__class__.objects.get
Para django <1.10
topic._default_manager.get(id=topic_id)
Aunque no deberías usarlo así. El _default_manager y _base_manager son privados, por lo que se recomienda usarlos solo si está dentro del modelo Topic, como cuando desea usar el Administrador en una función propietaria, digamos:
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', ...]
fuente
topic.__class__.objects.get(id=topic_id)
.self.__class__.objects
funciona el truco según tu otra respuesta.También podría ser causado por un par de paréntesis demasiado, p. Ej.
ModelClass().objects.filter(...)
en lugar de la correcta
ModelClass.objects.filter(...)
A veces me pasa cuando bpython (o un IDE) agrega automáticamente paréntesis.
El resultado, por supuesto, es el mismo: tiene una instancia en lugar de una clase.
fuente
si el tema fuera una instancia de ContentType (que no lo es), esto habría funcionado:
topic.model_class().objects.filter(forum = forum)
fuente
model_class()
es un método delContentType
modelo. Otras instancias de modelo, incluidastopic
, no tienen unmodel_class
método.Acabo de tener un problema similar a este error. Y mirando hacia atrás en su código, parece que también podría ser su problema. Creo que su problema es que su comparación de "id" con "int (topic_id)" y topic_id no está establecida.
def test(request, post_id): post = topic.objects.get(id = int(topic_id)) post.delete()
Supongo que su código debería usar "post_id" no "topic_id"
def test(request, post_id): post = topic.objects.get(id = int(post_id)) post.delete()
fuente