Python Django Queryset:按相关项管理器筛选
我有一个由许多内容块组成的页面模型Python Django Queryset:按相关项管理器筛选,python,django,django-queryset,Python,Django,Django Queryset,我有一个由许多内容块组成的页面模型 class Page(models.Model): ... class Block(models.Model): page = models.ForeignKey(Page) ... 块还有一些其他属性,用于确定它是否被视为“活动”(一对布尔值和一个日期时间字段)。我有一个用于块模型的管理器,这样我就可以得到活动块的列表 Block.objects.active() Page.objects.first().block_set.ac
class Page(models.Model):
...
class Block(models.Model):
page = models.ForeignKey(Page)
...
块
还有一些其他属性,用于确定它是否被视为“活动”(一对布尔值和一个日期时间字段)。我有一个用于块
模型的管理器,这样我就可以得到活动块的列表
Block.objects.active()
Page.objects.first().block_set.active()
我希望能够编写一个queryset,以仅返回具有活动块的页面
对象。我想使用现有的块
活动管理器来实现这一点,因此我只定义一次“活动”块的定义(干式)。例如:
Page.objects.annotate(count=Count('block__active')).filter(count__gt=0)
显然,这不起作用,因为
active
不是Block
的属性。是否有一种方法可以使用现有的块
管理器来实现这一点?据我所知,使用单个查询集
无法实现这一点,因为您希望使用管理器中可用的active()
。但是,您可以通过在块
模型中添加到页面
来实现此结果,如下所示:
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)
现在在这个查询集上,您可以执行
annonate
或页面上允许的任何查询集。为什么不在模型上添加一个布尔字段,比如处于活动状态
,然后在保存()
或设置处于活动状态()
上更新它呢?然后您就可以通过该字段查询您的模型。计算active()
所需的所有数据都存储在数据库中了吗?因为当需要时,您可以使用该逻辑来构建注释。使用2个这样的查询来构建注释是有意义的。谢谢我来试一试。其中一个字段是datetime字段。模型是否处于活动状态部分取决于该字段的值和当前时间,因此我必须在每次加载object.Hm时对其进行评估。根据您所描述的,您可以使用类上的is\u active()
方法定义块是否处于活动状态。这是否意味着除非调用,否则块的活动/非活动状态保持不变,除非更改?