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 类的方法。
\nDjango 文档使用 QuerySet 方法创建管理器中描述了两种解决方案。
\n公共部分- 具有查询集方法的自定义 QuerySet 类
\nclass 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 ...\nRun Code Online (Sandbox Code Playgroud)\nA)如果您的管理器只有查询集方法而没有其他自定义方法
\n\xc2\xa0 \xc2\xa0 那么您可以简单地从查询集创建它。
class MyModel(models.Model):\n objects = MyCustomQuerySet.as_manager()\nRun Code Online (Sandbox Code Playgroud)\nB)如果您的经理还需要其他不返回查询集的方法:
\nclass MyCustomManager(models.Manager):\n ... # other methods\n\nclass MyModel(models.Model):\n objects = MyCustomManager.from_queryset(MyCustomQuerySet)()\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |