Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Queryset:按相关项管理器筛选_Python_Django_Django Queryset - Fatal编程技术网

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()
方法定义块是否处于活动状态。这是否意味着除非调用,否则块的活动/非活动状态保持不变,除非更改?