【问题标题】:Combine two model managers for a queryset为查询集组合两个模型管理器
【发布时间】:2011-07-24 12:00:38
【问题描述】:

有没有办法将自定义模型管理器应用于默认模型管理器生成的 QuerySet?

我需要使用默认模型管理器过滤 QuerySet,因为我有一个 M2M 直通模型,并且在那里进行过滤而不是将我的自定义管理器的复杂性增加一个数量级是最容易的:这个过滤器看起来如下:

talent_set = UserProfile.objects.filter(positions=Position.objects.get(position=filter))

然后我需要将我的自定义模型管理器应用于这个过滤后的查询,如下所示:

final_talent_set = UserProfile[filtered].custom_manager.do_something()

有没有办法做到这一点,或者我应该采取不同的方法?也许一种将列(来自自定义管理器)附加到默认管理器末尾的方法?谢谢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    嗯,为什么不在get_query_set() 中使用相同的filter

    我的意思是:

    class MyManager(models.Manager):
        def get_query_set(self):
            return super(MyManager, self).get_query_set().filter(
                positions=Position.objects.get(position=filter)
            )
    
        def do_something(self):
            q = self.get_query_set()
            # do something
    

    【讨论】:

    • Silver_Ghost:非常感谢。以及如何将变量“过滤器”传递给 MyManager?如何从视图中调用主模型?我将如何从主模型中调用自定义管理器?谢谢。
    • 变量可以传递给do_something()方法,但在这种情况下filter应该在do_something中调用: def do_something(self, filter): q = self.get_query_set() q = q .filter(Position.objects.get(position=filter))
    • Silver_Ghost: 以及如何从通过过滤器“writer”的视图中调用它——即相当于:UserProfile.custom_manager(filter='writer').do_something()
    • UserProfile.custom_manager.do_something(filter='write') 应该可以工作。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2020-08-02
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多