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() を呼び出して、「Music」カテゴリの要素のみをクエリする必要がありますか?それとも、最初にカテゴリを検索する際にそれらをフィルタリングする必要がありますか?

4

2 に答える 2

4

マネージャーは、クエリの「開始点」と考えることができます。デフォルトのマネージャーから始めた場合と同じように、フィルターをチェーンし続けることができます。

たとえば、Event.objects.filter(category='Music').filter(title='Beatles Concert')機能的には同等ですEvent.music.filter(title='Beatles Concert')

したがって、ダニエルが言うように、特別なことをする必要はありません。代わりにカスタムマネージャーのいずれかを選択してobjects、そこから移動します。

于 2010-05-25T20:32:40.893 に答える
2

何もする必要はありません (そしてcount_musicメソッドは不要です)。メソッドは、count()で定義された既存のクエリを使用しますget_query_set

于 2010-05-25T18:34:56.483 に答える