wagtail - PageQuerySet 上的过滤(由 specific() 重新调整)在 Wagtail 中返回 FieldError
问题描述
我正在使用 Wagtail Page 的子类模型。在下面的代码中,您可以看到 PhoenixPage 是 Wagtail Page 模型的子类的基本页面。
PhoenixArticlePage 和 PhoenixMealPrepPage 子类 PhoenixPage
PhoenixArticleIndexPage 是 PhoenixBaseIndexPage 的子类,而 PhoenixBaseIndexPage 又是 PhoenixPage 的子类
想法是对所有其他文章页面使用 PhoenixArticleIndexPage。
问题是即使在查询集上使用 specific() 方法后,我也无法在查询集上使用过滤器或任何其他操作。我尝试使用 order_by() 以及 filter()
有人可以在这里分享一些见解吗?可能有什么问题?
这是一个模型示例:
class PhoenixPage(Page):
"""
General use page with caching, templating, and SEO functionality.
All pages should inherit from this.
"""
class Meta:
verbose_name = _("Phoenix Page")
# Do not allow this page type to be created in wagtail admin
is_creatable = False
tags = ClusterTaggableManager(
through=PhoenixBaseTag,
verbose_name="Tags",
blank=True,
related_name="phoenixpage_tags",
)
class PhoenixBaseIndexPage(PaginatedListPageMixin, PhoenixPage):
class meta:
verbose_name = "Phoenix Base Index Page"
app_label = "v1"
index_show_subpages_default = True
is_creatable = False
class PhoenixArticleIndexPage(PhoenixBaseIndexPage):
class Meta:
verbose_name = "Phoenix Article Index Page"
app_label = "v1"
class PhoenixArticlePage(PhoenixPage):
class Meta:
verbose_name = "Phoenix Article Page"
app_label = "v1"
subpage_types = []
parent_page_types = ["v1.PhoenixArticleIndexPage"]
class PhoenixMealPrepPage(PhoenixPage):
class Meta:
verbose_name = "Phoenix Meal Prep Page"
app_label = "v1"
subpage_types = []
parent_page_types = ["v1.PhoenixArticleIndexPage"]
这是我尝试过的 shell 查询。
索引页面
In [4]: a = PhoenixArticleIndexPage.objects.all()[0]
In [5]: a
Out[5]: <PhoenixArticleIndexPage: articles>
正如预期的那样,get_children 返回 Wagtail Page 的所有实例。
In [6]: a.get_children()
Out[6]: <PageQuerySet [<Page: article title>, <Page: article title2>, <Page: Our 30-Day Reset Recipes Are So Easy AND Delicious>]>
从索引页面获取特定的孩子。
In [7]: a.get_children().specific()
Out[7]: <PageQuerySet [<PhoenixArticlePage: article title>, <PhoenixArticlePage: article title2>, <PhoenixMealPrepPage: Our 30-Day Reset Recipes Are So Easy AND Delicious>]>
获取标签并尝试过滤查询集
In [8]: q = a.get_children().specific()
In [12]: m = PhoenixTag.objects.get(slug='meal')
In [16]: k={"tags":m}
In [19]: q.filter(**k)
***FieldError: Cannot resolve keyword 'tags' into field. Choices are ...***
但是,如果我转到查询集中的特定条目,那么我可以在上面看到标签字段。
In [15]: q[2]
Out[15]: <PhoenixMealPrepPage: Our 30-Day Reset Recipes Are So Easy AND Delicious>
In [16]: q[2].tags
Out[16]: <modelcluster.contrib.taggit._ClusterTaggableManager at 0x1060832b0>
可能是不同的问题,但在此处添加以供参考。
发现在查询集上使用差异()和特定()方法的极端情况。
In [87]: q = PhoenixPage.objects.child_of(a).live()
In [89]: f = q.filter(featured=True)[:3]
In [91]: l = q.difference(f)
In [93]: l.order_by(a.index_order_by).specific() . <-- does not work
DatabaseError: ORDER BY term does not match any column in the result set.
解决方案
PageQuerySetspecific()
方法的工作原理是在基本模型上正常运行初始查询Page
,然后运行附加查询(针对结果中找到的每种不同页面类型一个查询)以从特定页面模型中检索信息。这意味着不可能在filter
ororder_by
子句中使用来自特定模型的字段,因为这些字段必须是初始查询的一部分,此时 Django 无法知道涉及哪些页面模型。
但是,如果您知道您的查询应该只返回PhoenixPage
包含您要过滤/排序的字段的一种特定类型的页面(在这种情况下),您可以重新组织查询表达式,以便查询在该模型上发生:
PhoenixPage.objects.child_of(a).filter(tags=m).specific()
推荐阅读
- python-2.7 - 无法在 Ubuntu 服务器上停用虚拟环境
- java - 尝试在 HTTPCLIENT -JAVA 中发送 POST 请求时,收到 400 Bad Request
- html - 如何修复从 div 元素底部延伸出来的文本
- json - docker和格式json
- matlab - 如何编写一个函数来逼近一阶偏导数
- javascript - 在 Cannon.js 中禁用身体碰撞
- ios - userNotificationCenter:didReceive:withCompletionHandler 太短
- java - 使用bash编译java时出现Invalid flag错误
- excel-charts - 柱形图,其中每列具有不同的高度和宽度
- java - TypedArray 的 getColor() 方法中的 index 参数的目的是什么?