1

我有以下模型代码:

from django.db import models
from categories.models import Category

class MusicManager(models.Manager):
    def get_query_set(self):
        return super(MusicManager, self).get_query_set().filter(category='Music')
    def count_music(self):
        return self.all().count()

class SportManager(models.Manager):
    def get_query_set(self):
        return super(MusicManager, self).get_query_set().filter(category='Sport')        

class Event(models.Model): 
    title = models.CharField(max_length=120)
    category = models.ForeignKey(Category)
    objects = models.Manager()
    music = MusicManager()
    sport = SportManager()

现在通过注册 MusicManager() 和 SportManager() 我可以调用 Event.music.all() 和 Event.sport.all() 查询。但是我怎样才能创建 Event.music.count() ?我应该在 MusicManager 的 count_music() 函数中调用 self.all() 以仅查询具有“音乐”类别的元素,还是我仍然需要先过滤它们以搜索类别?

4

2 回答 2

4

您可以将管理器视为查询的“起点”——您可以继续链接过滤器,就像您从默认管理器开始一样。

例如,Event.objects.filter(category='Music').filter(title='Beatles Concert')在功能上等同于Event.music.filter(title='Beatles Concert')

因此,正如 Daniel 所说,您实际上不需要做任何特别的事情,只需选择一个自定义管理器,而不是objects从那里开始。

于 2010-05-25T20:32:40.893 回答
2

你不需要做任何事情(你的count_music方法是不必要的)。该count()方法将使用由 定义的现有查询get_query_set

于 2010-05-25T18:34:56.483 回答