Django:自定义模型管理器问题

时间:2010-10-02 20:03:57

标签: django

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

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'

编辑:似乎问题是如何将自定义过滤器功能连接在一起:games = Game.objects.some_filter1().some_filter2()[:5]这样的内容对我来说不起作用。

3 个答案:

答案 0 :(得分:4)

您可以在QuerySet方法filter()

之前将some_filter()应用于MyManager对象
games = Game.objects.some_filter().filter(any_filter)[:5]

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

答案 1 :(得分:3)

我找到了办法。还需要定义一个新的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()

答案 2 :(得分:0)

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

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

MyQueryset.as_manager()

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