2016-06-23 6 views
1

Djangoクエリツールを使用して、一連の関連オブジェクトと関係する可能性があるいくつかの基準を満たすオブジェクトのリストを返す方法を探しています。このクエリでDjango:外部キーオブジェクトのプロパティのクエリ

class Book(models.Model): 
    name = models.CharField(max_length=100) 

class Chapter(models.model): 
    name = models.CharField(max_length=100) 
    book = models.ForeignKey(Book) 
    length = models.IntegerField(default=0) 

が、私はすべてのコンポーネントChapterlength > 100を有する場合、すべてのBooksを取得したい:ここで私が何を意味するかです。しかし、これはそれに近づくための最も素朴な方法は明らかである

for book in Book.objects.all(): 
    for chapter in book.chapter_set.all(): 
     {do whatever to record if this chapter is valid/invalid} 

は、私は私のような何かを行うことができます実現します。ネストされたforループを避ける良い方法があると確信していますが、まず最初にすべてのオブジェクトを反復処理しないようにしたいと思います。

さまざまなDjangoツールを使用して、のオブジェクトのプロパティを使用するクエリを作成する方法はありますか?この方法で動作するドキュメントでは何も見つかりません。すべての例では、クエリを組み込むのではなく、特定のインスタンスの_setを使用しています。

例えば、私は(これは私が後で戻って自分のコンピュータに到達するまで、おそらく一人で副選択がうまくいく未テストです)、次のSQLは、直接私がここで何をしようとしている達成だと思う:

select * from book b, (select book_id 
         from chapter 
         group by book_id 
         having min(length) = 100) x 
where b.book_id = x.book_id; 

また、未処理のSQLを回避しようとしていますので、これ(またはそれのいくつかのバージョン)が機能しても、Djangoのクエリ機能の詳細については、filter()F(),Q()などの表現。あなたはたとえば以下100に等しいlengthを有する少なくとも一つのChapterを持っているものを除くすべてのBook秒を照会しようとすることができ

+0

申し訳ありませんが、完全に質問を読み違えます。新しい回答を投稿します。 – e4c5

答えて

0

books = Book.objects.exclude(chapter__length__le=100) 
+1

偉大なアイデア、これは私が考えていなかったものです。クエリ内のFKedオブジェクトのグループのプロパティを直接アドレス指定する方法がない場合は、除外を使用することが必要です。ありがとうございました! – dkhaupt

関連する問題