django - queryset - Gerente no es accesible a través de instancias modelo
django update (5)
El error en cuestión se produce cuando intenta acceder al Manager
de un modelo a través de una instancia del modelo. Usaste nombres de clase en minúsculas . Esto hace que sea difícil decir si el error es causado por una instancia que accede al Manager
o no. Como se desconocen otros escenarios que pueden causar este error, sigo suponiendo que de alguna manera ha mezclado la variable de topic
para que termine señalando una instancia del modelo de topic
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()
# ^^^^^
# Model, not instance.
¿Qué está pasando mal? objects
es un Manager
disponible en el nivel de clase, no en las instancias. Consulte la documentación para recuperar objetos para más detalles. Cita de dinero:
Managers
solo se puede acceder 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
Mira los comentarios de @Daniel a continuación. Es una buena idea (es más, DEBES: P) utilizar el título del caso para los nombres de las clases. Por ejemplo Topic
lugar de topic
. Los nombres de sus clases causan cierta confusión ya sea que se refiera a una instancia o a una clase. Como el Manager isn''t accessible via <model> instances
es muy específico, puedo ofrecer una solución. El error puede no ser tan evidente por sí mismo siempre.
Estoy tratando de obtener instancia de objetos modelo en otro. Y levanto este error:
Manager isn''t accessible via topic instance
Aquí está mi modelo:
class forum(models.Model):
# Some attributs
class topic(models.Model):
# Some attributs
class post(models.Model):
# Some attributs
def delete(self):
forum = self.topic.forum
super(post, self).delete()
forum.topic_count = topic.objects.filter(forum = forum).count()
Aquí está mi vista:
def test(request, post_id):
post = topic.objects.get(id = int(topic_id))
post.delete()
Y consigo:
post.delete()
forum.topic_count = topic.objects.filter(forum = forum).count()
Manager isn''t accessible via topic instances
Para django <1.10
topic._default_manager.get(id=topic_id)
Aunque no deberías usarlo así. _default_manager y _base_manager son privados, por lo que es recomendable usarlos solo si está dentro del modelo Topic, como cuando quiere 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'', ...]
También podría ser causado por un par de parantheses demasiado, por ejemplo
ModelClass().objects.filter(...)
en lugar de la correcta
ModelClass.objects.filter(...)
A veces me pasa cuando bpython (o un IDE) agrega automáticamente parantheses.
El resultado, por supuesto, es el mismo: tienes una instancia en lugar de una clase.
si el tema fuera una instancia ContentType (que no lo es), esto hubiera funcionado:
topic.model_class().objects.filter(forum = forum)
topic.__class__.objects.get(id=topic_id)