V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coolair
V2EX  ›  Django

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

  •  
  •   coolair · 357 天前 · 1656 次点击
    这是一个创建于 357 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 上,应该如何处理啊?

    4 条回复    2024-01-05 11:21:12 +08:00
    chaleaochexist
        1
    chaleaochexist  
       357 天前
    clone
    你用的是哪个 django 版本?
    chaleaochexist
        2
    chaleaochexist  
       357 天前
    老版本 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
        3
    mPatrickStar  
       357 天前
    试试这样能满足你的要求吗

    class CustomManager(models.Manager):

    def get_queryset(self):
    conditions = ...
    return super().get_queryset().filter(conditions)
    param
        4
    param  
       357 天前 via Android
    @chaleaochexist 可以用 MyQueryset.as_maneger
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5453 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:27 · PVG 16:27 · LAX 00:27 · JFK 03:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.