从Many2ManyField获取QuerySets(包括相关字段)

时间:2010-06-15 14:12:42

标签: django list django-queryset

Hay,我有一个模板,里面有一块板子

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

1 个答案:

答案 0 :(得分:2)

[你的qn显示'Thread'模型,但接着在你的wokring代码中引用'listing_set' - 我认为这是一个错字?]

您可以使用Q对象。假设您的Board模型有一个包含董事会名称的“名称”字段,我相信以下内容应该有效:

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

第一个Q对象选择作为电路板一部分的线程,其中'parent_board'设置为名为'Computing'的电路板。第二个Q对象选择直接属于电路板名称为“Computing”的线程。