pipe理器无法通过模型实例访问

我想在另一个模型对象实例。 我提出这个错误:

Manager isn't accessible via topic instance 

这是我的模型:

 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() 

这是我的看法:

 def test(request, post_id): post = topic.objects.get(id = int(topic_id)) post.delete() 

我得到:

 post.delete() forum.topic_count = topic.objects.filter(forum = forum).count() Manager isn't accessible via topic instances 

当您尝试通过模型的实例访问模型的Manager时,会导致有问题的错误。 你已经使用了小写的类名。 这很难说如果错误是由访问Manager的实例引起的。 由于可能导致此错误的其他情况是未知的我进行的假设,你已经混淆了topicvariables,以便最终指向topic模型,而不是类的实例。

这条线是罪魁祸首:

 forum.topic_count = topic.objects.filter(forum = forum).count() # ^^^^^ 

你必须使用:

 forum.topic_count = Topic.objects.filter(forum = forum).count() # ^^^^^ # Model, not instance. 

出了什么问题? objects是在类级别可用的Manager ,而不是实例。 有关详细信息,请参阅检索对象的文档 。 货币报价:

Managers 只能通过模型类访问,而不能通过模型​​实例访问,以实现“表级”操作和“logging级”操作之间的分离。

(强调添加)

更新

请参阅下面的@Daniel的评论。 这是一个好主意(不,你必须:P)使用标题大小写的类名。 例如Topic而不是topic 。 不pipe你是指一个实例还是一个类,你的类名都会引起混淆。 由于Manager isn't accessible via <model> instances非常具体,所以我能够提供一个解决scheme。错误总是不那么明显。

对于Django <1.10

 topic._default_manager.get(id=topic_id) 

虽然你不应该这样使用它。 _default_manager和_base_manager是私有的,所以只有当你在Topic模型中时才使用它们,比如当你想在一个私有函数中使用Manager时,我们假设:

 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', ...] 
 topic.__class__.objects.get(id=topic_id) 

也可能是由一对偏见引起的太多,例如

 ModelClass().objects.filter(...) 

而不是正确的

 ModelClass.objects.filter(...) 

当bpython(或IDE)自动添加缺口时,有时会发生。

结果当然是一样的 – 你有一个实例,而不是一个类。

如果主题是一个ContentType实例(它不是),这将工作:

 topic.model_class().objects.filter(forum = forum)