Django 模型自定义 Manager 自定义 filter 如何支持链式调用?

125 天前
 coolair
class CustomManager(models.Manager):
    def filter(self, *args, **kwargs):
        conditions = ...
        return super().get_queryset().filter(conditions).filter(*args, **kwargs)

这样使用 Custom.objects.filter(key=value) 是没有问题的,但是 Custom.objects.filter(key=value).filter(key2=value2) 这样就不行了,因为这个 filter 只作用在 manager 上,而没有作用在 queryset 上,应该如何处理啊?

631 次点击
所在节点    Django
4 条回复
chaleaochexist
125 天前
clone
你用的是哪个 django 版本?
chaleaochexist
125 天前
老版本 django 可以这样解决.
```
class MyQueryset(models.QuerySet):
pass
class Manager(MyManagerBase.from_queryset(MyQueryset)):
def get_queryset(self):
return MyQueryset(self.model)
```
新版本的话
https://github1s.com/django/django/blob/HEAD/django/db/models/query.py
参考一下`def _filter_or_exclude(self, negate, args, kwargs):` 这个方法

好久不用 django 了 仅供参考.
mPatrickStar
125 天前
试试这样能满足你的要求吗

class CustomManager(models.Manager):

def get_queryset(self):
conditions = ...
return super().get_queryset().filter(conditions)
param
124 天前
@chaleaochexist 可以用 MyQueryset.as_maneger

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX