2010-06-15 88 views
1

乾草,我有房子董事會獲取查詢集(包括相關領域)

class Board(models.Model): 
    parent_board = models.ForeignKey('self', blank=True, null=True) 

每塊板可以屬於另一個板

的模型,因此說

Linux 
Windows 
OS X 

能屬於所謂的板

Computing 

這些電路板容納一個Thread對象

class Thread(models.Model): 
    board = models.ForeignKey(Board) 

現在,說我一個線程分配到Windows板,我可以很容易地得到這個對象。

但我想列出與計算

線程屬於Windows的板相關聯的所有線程,但它也將通過協會屬於計算板。

如何在計算板上運行查詢並從其子板中檢索所有線程(以及任何屬於計算線程的屬性)?

我已經做到了,但它是非常粗糙的,我不知道是否有這樣做的更多的Django的方式,

繼承人我此刻的它的代碼(工作)

listings = [] # blank list to hold clean values 
for board in board.board_set.all(): # for each board 
    for listing in board.listing_set.all(): # get the listing from each board 
     listings.append(listing) # append to the listings list 

回答

2

[你qn顯示一個'線程'模型,但後來繼續在您的代碼中引用'listing_set' - 我認爲這是一個錯字?]

您可以使用Q對象。假設你的主板型號有包含板名稱的「名稱」字段,我相信下面應該工作:

from django.db.models import Q 
Thread.objects.filter(Q(board__parent_board__name='Computing') | Q(name='Computing')) 

前Q對象選擇哪個是哪個了吧parent_board「設置爲一個板的一部分線程名爲'Computing'的董事會。第二個Q對象選擇直接屬於名爲'Computing'的棋盤的線程。

+0

正確,列表是一個線程,它被重命名。 – dotty 2010-06-15 15:21:23

+0

如果我不知道董事會的名稱會發生​​什麼情況,並且我將board = Board.objects.get(pk = 4) – dotty 2010-06-15 15:23:12

+0

board = Board.objects.get(pk = 3),然後threads = Threads。 objects.filter(Q(board__parent_board = board))是一種享受! – dotty 2010-06-15 15:24:41