我正在尝试一个简单的自定义管理器,但我无法连接自定义查询:
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]
这样的内容对我来说不起作用。
答案 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了解更多优化代码的方法。