2010-06-15 92 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