在从 Wagtail 核心页面导入的多个模型中过滤自定义字段

Filter on custom field across multiple models that import from Wagtail core Page

我有两个共享共同字段的自定义 Page 模型,例如:

class CustomPageModelOne(Page):
    custom_field = models.IntegerField()
    ...

class CustomPageModelTwo(Page):
    custom_field = models.IntegerField()
    ...

我需要 运行,理想情况下,需要一个过滤器跨越两种类型的自定义 Page 模型。 Wagtail 文档说我可以使用 exact_type 方法来指定从核心 Page 继承的多个模型,所以我正在尝试以下的一些变体:

Page.objects.exact_type(CustomPageModelOne, CustomPageModelTwo).filter(custom_field=123)

但是,当我尝试过滤任何使用这两种模型的 QuerySet 时,出现错误:

django.core.exceptions.FieldError: Cannot resolve keyword 'custom_field' into field.

如何查询共享一个共同字段的多个 Wagtail 自定义页面模型?

注意:我考虑过创建一个继承自 Page 的抽象 class,但无法在需要的文件中导入该抽象模型。

摘要class示例:

class CustomFieldModel(Page):
    custom_field = models.IntegerField()

    class Meta:
        abstract = True

class CustomPageModelOne(CustomFieldModel):
    pass

class CustomPageModelTwo(CustomFieldModel):
    pass

正如您所做的那样 Page.objects... 您只能过滤 fields of the Page modelPage

的子类

要专门针对 CustomPageModelOne 的字段进行过滤,您必须使用 CustomPageModel.objects... 该模型具有该字段并且您的自定义页面模型都是

的子类

显然 Page.objects.exact_type 仅返回基于 Page 的查询集,这是有道理的,因为 exact_type 无法知道从 [=12= 派生的模型中会出现哪些字段].如果重新构建模型不是一种选择,我建议将以下方法作为替代方法:

from itertools import chain

model_one_results = CustomPageModelOne.objects.filter(custom_field=123)
model_two_results = CustomPageModelTwo.objects.filter(custom_field=123)
all_results = list(chain(model_one_results, model_two_results))