django 无法通过模型示例访问管理器

w6lpcovy  于 2023-02-05  发布在  Go
关注(0)|答案(7)|浏览(154)

我尝试在另一个示例中获取模型对象示例,并引发了此错误:
无法通过主题示例访问管理器
这是我的模型:

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
pu82cl6c

pu82cl6c1#

当你试图通过一个模型的示例访问模型的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是非常具体的,我可以提供一个解决方案。错误可能并不总是那么明显。

dgiusagp

dgiusagp2#

topic.__class__.objects.get(id=topic_id)
5m1hhzi4

5m1hhzi43#

对于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', ...]
f0ofjuux

f0ofjuux4#

也可能是由于一对parantheses太多,例如。

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

而不是正确的

ModelClass.objects.filter(...)

当bpython(或IDE)自动添加parantheses时,我有时会遇到这种情况。
当然,结果是相同的--您拥有的是示例而不是类。

nuypyhwy

nuypyhwy5#

如果Topics是ContentType示例(实际上不是),那么这就可以工作:

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

agyaoht76#

我刚刚遇到了一个类似于这个错误的问题。回头看看你的代码,它似乎也是你的问题。我认为你的问题是你比较“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()
ulydmbyx

ulydmbyx7#

我得到了下面相同的错误:
属性错误:无法通过CustomUser示例访问管理器
当我使用request.user.objects访问Manager时,如下所示:

"views.py"

from django.http import HttpResponse

def test(request):
    print(request.user.objects)
    return HttpResponse("Test")

相关问题