Django 管理器查询不能在查询链中工作。AttributeError:“QuerySet”对象没有属性<管理器方法>

Ham*_*adi 4 python django django-models django-orm django-managers

问题:我已经为一个模型实现了一个自定义管理器,只有一个命名的自定义查询集get_by_tag,如果我这样使用它,它就可以正常工作:

ViewStatistic.objects.get_by_tag('some-tag-name').filter(user=user_id)
Run Code Online (Sandbox Code Playgroud)

但是当我改变查询的顺序时,以这种方式:

ViewStatistic.objects.filter(user=user_id).get_by_tag('some-tag-name')
Run Code Online (Sandbox Code Playgroud)

它不起作用!并引发此错误:

AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud)

我是不是错过了什么?!我怎样才能按照这样的顺序做到这一点?

PS:自定义管理器是这样的:

AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud)

hyn*_*cer 10

如果您想在查询集链内部使用查询集方法,而不仅仅是直接在管理器之后使用,则应该将它们定义为连接到管理器的自定义 QuerySet 类的方法。

\n

Django 文档使用 QuerySet 方法创建管理器中描述了两种解决方案。

\n

公共部分- 具有查询集方法的自定义 QuerySet 类

\n
class MyCustomQuerySet(models.QuerySet):\n    def get_by_tag(self, tag_name):\n        return self.filter(post__pk__in=Post.objects.filter(tags__pk=tag_name))\n\n    # more possible queryset methods ...\n
Run Code Online (Sandbox Code Playgroud)\n

A)如果您的管理器只有查询集方法而没有其他自定义方法
\n\xc2\xa0 \xc2\xa0 那么您可以简单地从查询集创建它。

\n
class MyModel(models.Model):\n    objects = MyCustomQuerySet.as_manager()\n
Run Code Online (Sandbox Code Playgroud)\n

B)如果您的经理还需要其他不返回查询集的方法:

\n
class MyCustomManager(models.Manager):\n    ...  # other methods\n\nclass MyModel(models.Model):\n    objects = MyCustomManager.from_queryset(MyCustomQuerySet)()\n
Run Code Online (Sandbox Code Playgroud)\n