2016-06-23 57 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) 

在此查詢,我要檢索所有Books,每一個組件都有Chapterlength > 100

我知道我可以做這樣的事情:

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工具來構建使用chapter_set中的對象屬性的查詢?我無法在以這種方式工作的文檔中找到任何內容 - 每個示例都使用一個特定實例的_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()等表達式。

+0

對不起完全誤解的問題。將發佈一個新的答案。 – e4c5

回答

0

你可以試着查詢所有Book小號除了那些至少有一個Chapterlength小於或等於100。例如:

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

好主意,這是我剛纔沒有考慮過的事情。如果沒有辦法直接解決查詢中FKed對象組的屬性,我認爲使用排除將是我需要去的方式。謝謝! – dkhaupt