あるモデルのクエリセットを指定して、外部キーで関連付けられた別のモデルのクエリセットを取得したいと考えています。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
の遅延評価などの利点を得ることができますか?
編集されたシナリオとソリューション
そのため、私の質問の適用が上記の方法とは少し異なることに後で気付きました。ダニエル・ローズマンの状況は非常に理にかなっています。私の状況は、 Entry オブジェクトのクエリセットを返すauthor.entry_set.manager_method().blogs
場所に似ています。manager_method()
私が見つけた解決策に影響を与えたので、私は彼の答えを受け入れました。
author_blogs = Blog.objects.filter(entry__in=author.entry_set.manager_method())
良い点は、DB クエリを 1 つしか使用しないことです。blogs()
少しトリッキーで冗長なので、上記を返す Author のオブジェクトメソッドとして定義するのがベストだと思います。