2011-08-07 8 views
0

私はカテゴリマネージャとプロジェクトマネージャの2つのモデルを持っています。他のマネージャからのオブジェクトを含む空でないレコードのモデルマネージャ

class PopulatedCategoriesManager(models.Manager): 
    def get_query_set(self): 
     return super(PopulatedCategoriesManager, self) \ 
      .get_query_set() \ 
      .filter(projects__is_published=True).distinct() 

class Category(models.Model): 
    title = models.CharField(max_length=50) 

    class Meta(Orderable.Meta): 
     verbose_name_plural = 'Categories' 

    objects = models.Manager() 
    populated = PopulatedCategoriesManager() 

class PublishedProjectsManager(models.Manager): 
    def get_query_set(self): 
     return super(PublishedProjectsManager, self) \ 
      .get_query_set().filter(is_published=True) 

class Project(models.Model): 
    title = models.CharField(max_length=50) 
    category = models.ForeignKey(Category, related_name='projects') 
    #other fields 

    objects = models.Manager() 
    published = PublishedProjectsManager() 

PopulatedCategoriesManagerが公開されているプロジェクトを持っている唯一のカテゴリーを返し、期待通りに動作しますが、私の問題は、テンプレートレベルです。公開されたプロジェクトのみにアクセスするのに問題があります。

カテゴリインスタンスは、公開されたプロジェクトのみにアクセスする方法を知らないため、これらのオブジェクトを取得する最も効率的な方法は何かについて興味がありますか?私は書くことができるようにしてみたい

...

{% for category in categories %} 
    {% for project in category.published_projects.all %} 

    {% endfor %} 
{% endfor %} 

...各カテゴリのデータベース呼び出しを行うことはありません。誰かが私にいくつかのポインタを教えてもらえますか?私はこれを行うためにいくつかの未処理のSQLを書くことができ、私はanother Stack Overflow postからいくつかのアイデアを持っていますが、これをモデルレベルで解決したいと思います。

答えて

1

おそらく、おそらく、すべてのpublished_projectsをcategory_idで注文してから、テンプレートで再グループ化することが最善の策だと思います。

projects = Project.published.all().order_by('category_id') 

...

{% regroup projects by category_id as project_categories %} 

{% for category in project_categories %} 
    {% for project in category.list %} 
     {{ project.title }} 
    {% endfor %} 
{% endfor %} 
あなたは、カテゴリの詳細と、それを使用するなど、ハタが必要ですが、あなたが行う場合は、元に select_related()を追加できるかどうかは表示されません

クエリ。

+0

偉大な答えダニエル。私はselect_related()を追加し、再分類グループを非常に微妙に調整して{%カテゴリのカテゴリ別プロジェクト再編成}と、ビオラ1のSQLステートメントとすべての正しいプロジェクト:)あなたのお時間をありがとうございました。 – Brandon

関連する問題