我尝试在另一个示例中获取模型对象示例,并引发了此错误:
无法通过主题示例访问管理器
这是我的模型:
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
7条答案
按热度按时间pu82cl6c1#
当你试图通过一个模型的示例访问模型的
Manager
时,就会产生这个错误。你使用了 * 小写 * 的类名。这使得很难说这个错误是否是由一个示例访问Manager
引起的。由于可能导致此错误的其他情况尚不清楚,因此我假设您以某种方式混淆了topic
变量,从而导致指向topic
模型的示例而不是类。这一行是罪魁祸首:
您必须使用:
objects
是Manager
在类级别上可用,而不是示例。有关检索对象的详细信息,请参阅文档。Managers
***只能***通过模型类访问,而不是从模型示例访问,以强制"表级"操作和"记录级"操作之间的分离。(着重号后加)
请看下面@Daniel的评论。类名使用标题大小写是个好主意(不,你必须:P)。例如
Topic
而不是topic
。你的类名会引起一些混淆,不管你是指一个示例还是一个类。因为Manager isn't accessible via <model> instances
是非常具体的,我可以提供一个解决方案。错误可能并不总是那么明显。dgiusagp2#
5m1hhzi43#
对于django〈1.10
虽然你不应该这样使用它,但_default_manager和_base_manager是私有的,所以建议你只在Topic模型中使用它们,比如当你想在一个私有函数中使用Manager的时候,比如:
f0ofjuux4#
也可能是由于一对parantheses太多,例如。
而不是正确的
当bpython(或IDE)自动添加parantheses时,我有时会遇到这种情况。
当然,结果是相同的--您拥有的是示例而不是类。
nuypyhwy5#
如果Topics是ContentType示例(实际上不是),那么这就可以工作:
agyaoht76#
我刚刚遇到了一个类似于这个错误的问题。回头看看你的代码,它似乎也是你的问题。我认为你的问题是你比较“id”和“int(topic_id)”,而topic_id没有设置。
我猜您的代码应该使用“post_id”而不是“topic_id”
ulydmbyx7#
我得到了下面相同的错误:
属性错误:无法通过CustomUser示例访问管理器
当我使用
request.user.objects
访问Manager
时,如下所示: