django 在Wagtail 4.0中,我如何查询页面未激活的修订?

x33g5p2x  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(91)

我正在将一些代码从wagtail 3.0升级到wagtail 4.0。我的代码中有一个问题查询,我不知道如何修复。
在旧代码中,查询看起来像这样:

PageRevision.objects.filter(approved_go_live_at__isnull=False, page__live=False)

字符串
由于PageRevision已被弃用,我将其更新为以下内容

Revision.page_revisions.filter(approved_go_live_at__isnull=False, page__live=False)


这导致了一个错误,由sql中的类型不匹配引起:

ProgrammingError: operator does not exist: character varying = integer
LINE 1: ...core_page" ON ("wagtailcore_revision"."object_id" = "wagtail...
                                                             ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.


在重新检查文档后,我将其更改为:

Revision.page_revisions.filter(approved_go_live_at__isnull=False, content_object__live=False)


这只是得到了一个不同的错误:

FieldError: Field 'content_object' does not generate an automatic reverse relation and therefore cannot be used for reverse querying. If it is a GenericForeignKey, consider adding a GenericRelation.


现在我很困惑,因为content_object是一个直接在Revision上的字段,所以它不应该是一个“反向”关系。
看看Page,它似乎 * 确实 * 有一个GenericRelation,(与related_query_name=page)指向修订版。但这是我第一次尝试使用的,并得到了一个sql类型不匹配。
文档中谈到了类型转换,但我不知道如何让django在它生成的JOIN子句中进行类型转换。
最后一个问题:如何查询Revision s,通过相关页面上的字段进行过滤?

vwoqyblh

vwoqyblh1#

如果你使用的是PostgreSQL,这是由一个12年前的Django问题https://code.djangoproject.com/ticket/16055引起的,该问题将在Django 5.0中得到修复(在撰写本文时尚未发布)。
可能的解决方法:

from django.contrib.contenttypes.models import ContentType
from wagtail.models import Page, Revision

base_page_ct = ContentType.objects.get_for_model(Page)
not_live_ids = Page.objects.not_live().values_list('id', flat=True)
Revision.page_revisions.filter(base_content_type=base_page_ct, object_id__in=not_live_ids)

字符串
我如何查询关系,通过相关页面上的字段进行过滤?
我想你是指“查询修订”吧?
使用与上面类似的技巧,您可以首先过滤页面,使用values_list获取ID,然后通过基本Page内容类型和对象ID过滤修订。
由于QuerySets是惰性的,因此获取页面ID的第一个查询不会被直接计算,而是用作修订查询的子查询。

相关问题