gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:56 26 4
gpt4 key购买 nike

我有一个包含多个内容 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 上允许的任何操作。

关于python - Django 查询集 : filtering by related item manager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com