我有两个自定义的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))