You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail 4.0中如何查询关联非发布页面的Revision?

解决Wagtail 4.0中Revision关联Page字段的查询问题

在Wagtail 4.0升级后,PageRevision被弃用,改用Revision.page_revisions管理器,但直接查询时会遇到两个典型错误:

  • 使用page__live=False时,因Revision.object_id为字符类型、Page.id为整数类型,JOIN操作触发SQL类型不匹配错误;
  • 尝试content_object__live=False过滤时,由于content_object是GenericForeignKey,Django不支持通过它直接进行反向查询过滤。

解决方案一:显式转换类型并限定内容类型

通过Cast函数将object_id转为整数,同时限定内容类型为Page,解决类型匹配问题:

from django.db.models import Cast, IntegerField
from django.contrib.contenttypes.models import ContentType
from wagtail.core.models import Revision, Page

# 获取Page对应的内容类型
page_content_type = ContentType.objects.get_for_model(Page)

# 构建目标查询
target_revisions = Revision.page_revisions.filter(
    approved_go_live_at__isnull=False,
    content_type=page_content_type,
    # 将字符类型的object_id转换为整数,匹配Page的id字段类型
    object_id=Cast('object_id', IntegerField()),
    page__live=False
)

解决方案二:从Page模型反向查询

利用Page上已有的GenericRelation(page_revisions),从Page出发反向关联Revision,无需手动处理类型转换:

from wagtail.core.models import Page

# 查询未发布且关联已批准上线Revision的页面对应的Revision集合
target_revisions = Page.objects.filter(
    live=False,
    page_revisions__approved_go_live_at__isnull=False
).values_list('page_revisions', flat=True)

内容的提问来源于stack exchange,提问作者Matthew Scouten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:05:21