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
相关产品推荐
相关产品推荐

