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
的实例引起的。 由于可能导致此错误的其他情况是未知的我进行的假设,你已经混淆了topic
variables,以便最终指向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)