102

我正在尝试在另一个中获取模型对象实例,并引发此错误:

 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
4

6 回答 6

150

当您尝试Manager通过模型实例访问模型时,会导致有问题的错误。您使用了小写的类名。这使得很难说错误是否是由访问的实例引起的Manager。由于未知可能导致此错误的其他场景,我假设您以某种方式混淆了topic变量,因此您最终指向topic模型的实例而不是类。

这条线是罪魁祸首:

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

你必须使用:

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

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

Managers只能通过模型​​类不是模型实例访问,以强制区分“表级”操作和“记录级”操作。

(重点补充)

更新

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

于 2010-10-06T16:07:59.640 回答
64
topic.__class__.objects.get(id=topic_id)
于 2012-10-16T11:39:15.920 回答
33

对于 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', ...]
于 2012-04-11T17:40:16.057 回答
8

也可能是由于一对花括号过多引起的,例如

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

而不是正确的

ModelClass.objects.filter(...)

当 bpython(或 IDE)自动添加括号时,有时会发生在我身上。

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

于 2016-01-20T12:44:07.847 回答
0

如果 topic 是一个 ContentType 实例(它不是),这将有效:

topic.model_class().objects.filter(forum = forum)
于 2013-06-09T18:09:26.453 回答
0

我刚刚遇到了与此错误类似的问题。回顾您的代码,它似乎也可能是您的问题。我认为您的问题是您将“id”与“int(topic_id)”进行比较并且未设置topic_id。

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

我猜你的代码应该使用“post_id”而不是“topic_id”

def test(request, post_id):
    post = topic.objects.get(id = int(post_id))
    post.delete()
于 2019-01-19T06:07:11.673 回答