coolair
V2EX  ›  Django

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

  •  
  •   coolair · Jan 4, 2024 · 4378 views
    This topic created in 880 days ago, the information mentioned may be changed or developed.
    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 replies    2024-01-05 11:21:12 +08:00
    chaleaochexist
        1
    chaleaochexist  
       Jan 4, 2024
    clone
    你用的是哪个 django 版本?
    chaleaochexist
        2
    chaleaochexist  
       Jan 4, 2024
    老版本 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  
       Jan 4, 2024
    试试这样能满足你的要求吗

    class CustomManager(models.Manager):

    def get_queryset(self):
    conditions = ...
    return super().get_queryset().filter(conditions)
    param
        4
    param  
       Jan 5, 2024 via Android
    @chaleaochexist 可以用 MyQueryset.as_maneger
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5410 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 09:22 · PVG 17:22 · LAX 02:22 · JFK 05:22
    ♥ Do have faith in what you're doing.