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



我有两个自定义的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:无法将关键字"custom_field"解析为字段。

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

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

抽象类示例:

class CustomFieldModel(Page):
custom_field = models.IntegerField()
class Meta:
abstract = True
class CustomPageModelOne(CustomFieldModel):
pass
class CustomPageModelTwo(CustomFieldModel):
pass

在执行Page.objects...时,您只能过滤页面模型的字段和Page的子类

要特别筛选CustomPageModelOne的字段,您必须使用CustomPageModel.objects...,其中该模型具有该字段,并且您的两个自定义页面模型都是的子类

显然,Page.objects.exact_type只是返回一个基于Page的查询集,这是有道理的,因为exact_type无法知道Page派生的模型上会出现什么字段。如果不能重新构建您的模型,我建议使用以下方法作为替代方法:

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))

相关内容

  • 没有找到相关文章

最新更新