あるモデルのクエリーセットを考えると、私は外来キーに関連する別のモデルのクエリーセットを取得したいと思います。 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()
を定義し、上記を返すことをお勧めします。
ええ、それは私がもともとそれを提出したように質問への素晴らしい解決策になるでしょう。私の状況は若干異なっていました。あなたの答えは私が思いついた解決策に影響を与えたので、私はあなたの答えを受け入れました。私は私の質問に編集しました。ありがとう。 – acjay