update queryset manager django django-models instances django-managers

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)