【问题标题】:Get QuerySets from Many2ManyField (include related fields)从 Many2ManyField 获取 QuerySets(包括相关字段)
【发布时间】:2011-03-04 00:35:01
【问题描述】:

嘿,我有一个模型,里面有一块板

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板,但通过关联也会属于computing板。

我如何在计算板上运行查询并从其子板上检索所有线程(以及仅属于计算线程的任何线程)?

我已经做了,但是很粗糙,不知道有没有更多的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

【问题讨论】:

    标签: django list django-queryset


    【解决方案1】:

    [您的 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 对象选择直接属于名为“计算”的板的线程。

    【讨论】:

    • 如果我不知道板子的名称会发生​​什么,我得到板子板 = Board.objects.get(pk=4)
    • board = Board.objects.get(pk=3) 然后threads = Threads.objects.filter( Q(board__parent_board=board) ) 很好用!
    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 2020-10-22
    • 2012-08-13
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多