2013-02-26 10 views
8

あるモデルのクエリーセットを考えると、私は外来キーに関連する別のモデルのクエリーセットを取得したいと思います。 Djangoプロジェクトのドキュメントウェブログスキーマを取る:Djangoオリジナルのモデルでプレフィルタリングした後の関連オブジェクトのクエリーセット

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Author(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    pub_date = models.DateField() 
    mod_date = models.DateField() 
    authors = models.ManyToManyField(Author) 
    n_comments = models.IntegerField() 
    n_pingbacks = models.IntegerField() 
    rating = models.IntegerField() 

    def __unicode__(self): 
     return self.headline 

は私がauthorオブジェクトを持っている、と私は著者がクエリセットとして、のために書かれたことをすべてのブログを取得するとします。私はauthor_blogs = [entry.blog for entry in author.entry_set]のようなことをします。しかし、私はこのケースではクエリーセットではなく、リストを残しています。私はこれをORMクエリで直接行うことができる方法があるので、use_for_related_fields = Trueのカスタムエントリマネージャを使って設定し、author_blogs = author.entry_set.blogsのような処理を行い、クエリーセットの遅延評価などの利点を得ることができますか?

編集シナリオとソリューション

だから、私は私の質問のアプリケーションは、私はダニエル・ローズマンの状況は多くの意味を作るそのため、上記のことを提起した方法よりもわずかに異なっているという事実の後に実現。私の状況は、のようになります。manager_method()はEntryオブジェクトのクエリーセットを返します。彼の答えは、私が見つけた解決策に影響を与えたからです。

author_blogs = Blog.objects.filter(entry__in=author.entry_set.manager_method()) 

素晴らしいことは、1つのDBクエリしか使用しないということです。ちょっと難解で冗長なので、Authorのオブジェクトメソッドとしてblogs()を定義し、上記を返すことをお勧めします。

答えて

17

これは、ブログのクエリセットが必要な場合は、ブログモデルから始める必要があることを覚えておいてください。次に、二重アンダースコア構文を使用してリレーションを追跡することができます。だから:

author_blogs = Blog.objects.filter(entry__authors=author) 
+0

ええ、それは私がもともとそれを提出したように質問への素晴らしい解決策になるでしょう。私の状況は若干異なっていました。あなたの答えは私が思いついた解決策に影響を与えたので、私はあなたの答えを受け入れました。私は私の質問に編集しました。ありがとう。 – acjay