Skip to main content
 首页 » 编程设计

python之Django 查询集 : filtering by related item manager

2024年10月17日20qq号

我有一个包含多个内容 block 的页面模型。

class Page(models.Model): 
    ... 
 
class Block(models.Model): 
    page = models.ForeignKey(Page) 
    ... 

Block 有一些其他属性来确定它是否被认为是“事件的”(几个 bool 值和一个日期时间字段)。我有一个 Block 模型的管理器,这样我就可以获得事件 block 的列表

Block.objects.active() 
Page.objects.first().block_set.active() 

我希望能够编写一个查询集以仅返回具有事件 block 的 Page 对象。我想使用现有的 Block 事件管理器来执行此操作,因此我只定义一次“事件” block 的内容(DRY)。 IE 类似于:

Page.objects.annotate(count=Count('block__active')).filter(count__gt=0) 

显然这不起作用,因为 active 不是 Block 的属性。有什么方法可以使用现有的 Block 管理器来实现这一点?

请您参考如下方法:

据我所知,没有办法使用单个 queryset 来实现它,因为您想使用管理器中可用的 active()。但是您可以通过添加 related name 来实现结果到 Block 模型中的 Page 为:

class Block(models.Model): 
    page = models.ForeignKey(Page, related_name='related_block') 
    ... 

现在你的代码应该是:

active_blocks = Block.objects.active()  # Queryset with all active blocks 
# Queryset of Pages with Block in 'active_blocks'  
active_pages = Page.objects.filter(related_block__in=active_blocks) 

现在在此 QuerySet 上,您可以执行 annonate 或您希望在 Page 的 QuerySet 上允许的任何操作。