【问题标题】:chaining methods of custom model manager自定义模型管理器的链接方法
【发布时间】:2016-03-03 11:37:03
【问题描述】:

我正在尝试使用 django .as_manager() 函数将多个调用链接到自定义模型方法。

managers.py:

class ArticlesManager(models.Manager):
    def some_filter(self):
        return self.filter(something)

    def other_filter(self):
        return self.filter(something_else)

models.py

class Article(models.Model):
    # ...
    objects = ArticlesManager()

我希望能够致电Article.objects.some_filter().other_filter()

如果我尝试我得到这个错误:

'QuerySet' 对象没有属性 'other_filter'

some_filter 中使用return self.filter(something).as_manager() 只会将错误更改为:

“ManagerFromQuerySet”对象没有属性“other_filter”

并将其作为objects = ArticlesManager().as_manager() 放入模型中会将错误更改为:

AttributeError:“ProductsManager”对象没有属性“as_manager”


我不明白应该在哪里以及如何使用 as_manager 方法才能成功链接模型管理器方法。

【问题讨论】:

    标签: python django


    【解决方案1】:

    as_manager() 是 QuerySet 上的方法,而不是 Manager 上的方法。关键是它将自定义查询集转换为管理器,以便您可以在根objects 属性上调用从那里返回的查询集的方法。

    因此,将您的定义更改为class ArticlesQuerySet(models.QuerySet),将您的对象更改为objects = ArticlesQuerySet.as_manager(),一切都会正常工作。

    【讨论】:

    • 太棒了!现在可以了。我想知道为什么这不被视为默认做法,并且我阅读的所有手册/示例都使用 models.Manager 而不用 as_manager() 覆盖 models.QuerySet。就好像我们可以用一种编程语言编写函数/类而不是一起使用它们:这应该是默认行为,或者至少,它应该非常清楚并且有据可查,包括解释为什么这样做不是默认行为。非常感谢您的帮助!
    • 这种方法很好documented。它是在 1.7 中添加的,因此旧资源可能无法涵盖它。
    • 是的,我已经阅读了该页面,但是,tbh,我无法仅从中回答我自己的问题。
    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2012-06-04
    • 2011-04-20
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多