14

あるモデルのクエリセットを指定して、外部キーで関連付けられた別のモデルのクエリセットを取得したいと考えています。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 のオブジェクトメソッドとして定義するのがベストだと思います。

4

1 に答える 1

24

これの秘訣は、ブログのクエリセットが必要な場合は、ブログ モデルから始める必要があることを覚えておくことです。次に、二重下線構文を使用して関係をたどることができます。そう:

author_blogs = Blog.objects.filter(entry__authors=author)
于 2013-02-26T14:32:36.673 に答える