【问题标题】:Django: Custom model manager problemDjango:自定义模型管理器问题
【发布时间】:2011-04-20 07:49:25
【问题描述】:

我正在尝试一个简单的自定义管理器,但我无法连接自定义查询:

class MyManager(models.Manager):    
def some_filter(self):        
    qs = self.get_query_set()
    return qs.filter(score__gt = 10).order_by("-score")
class Game(models.Model):    
     score = models.IntegerField(blank=True, default=0)
     objects = MyManager()


games = Game.objects.filter(any_filter).some_filter()[:5]

但我得到 QuerySet' 对象没有属性 'some_filter'

编辑:问题似乎是如何将 custom 过滤器功能连接在一起:像games = Game.objects.some_filter1().some_filter2()[:5] 这样的东西对我不起作用。

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以在 QuerySet 方法 filter() 之前将 some_filter() 应用于 MyManager 对象

    games = Game.objects.some_filter().filter(any_filter)[:5]
    

    否则你应该添加 some_filter 方法到 QuerySet

    【讨论】:

    • 是的,但是如果我在 MyManager 中定义了 2 个过滤器,这并不能解决问题:Game.objects.some_filter().some_filter2() 将不起作用
    【解决方案2】:

    我找到了一种方法。还需要定义一个新的 QuerySet 类

    class GameQS(QuerySet):
        def some_filter1(self):
            return self.filter(score__gt = 10).order_by("-score")
        def some_filter2(self):
            return self.filter(score__gt = 50).order_by("-score")
    
    
    
    class GameManager(models.Manager):
        def get_query_set(self):
            return GameQS(self.model, using=self._db)
    
        def some_filer1(self):
            return self.get_query_set().some_filter1()
    
        def some_filter2(self):
            return self.get_query_set().some_filter2()
    

    【讨论】:

      【解决方案3】:

      如果您是使用模型管理器的新手,请先查看GabiMe's answer

      从 django 1.7 开始,使用 queryset as manager class method 保持代码 DRY

      MyQueryset.as_manager()
      

      如果您使用的是旧版本,请参阅 this question 了解更多优化代码的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-04
        • 2014-07-11
        相关资源
        最近更新 更多