我正在将一些代码从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,通过相关页面上的字段进行过滤?
1条答案
按热度按时间vwoqyblh1#
如果你使用的是PostgreSQL,这是由一个12年前的Django问题https://code.djangoproject.com/ticket/16055引起的,该问题将在Django 5.0中得到修复(在撰写本文时尚未发布)。
可能的解决方法:
字符串
我如何查询关系,通过相关页面上的字段进行过滤?
我想你是指“查询修订”吧?
使用与上面类似的技巧,您可以首先过滤页面,使用
values_list
获取ID,然后通过基本Page内容类型和对象ID过滤修订。由于QuerySets是惰性的,因此获取页面ID的第一个查询不会被直接计算,而是用作修订查询的子查询。