You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wagtail后台按category__name排序WorkshopIndexPage子页面?

解决Wagtail后台子页面按外键字段排序的问题

问题背景

现有Wagtail页面模型如下:

class WorkshopPage(Page):
    category = models.ForeignKey(
        WorkshopCategory, on_delete=models.SET_NULL, blank=True, null=True
    )

class WorkshopIndexPage(RoutablePageMixin, Page):
    subpage_types = ["WorkshopPage"]

需求是在Wagtail管理后台中,让WorkshopIndexPage的子页面按category__name排序。尝试在WorkshopPage的Meta类中设置排序无效后,重写get_children方法:

def get_children(self):
    qs = WorkshopPage.objects.order_by("category__name")
    return qs

但触发错误:Cannot combine queries on two different base models.

错误原因

直接返回WorkshopPage.objects.all()的QuerySet,和父类get_children返回的Page类型QuerySet模型不一致,导致ORM无法合并查询。

解决方法

正确的做法是基于父类返回的子页面QuerySet进行转换和排序,而非直接替换QuerySet:

from django.db.models import F

class WorkshopIndexPage(RoutablePageMixin, Page):
    subpage_types = ["WorkshopPage"]

    def get_children(self):
        # 获取当前页面的直接子页面,转换为WorkshopPage实例
        qs = super().get_children().specific(WorkshopPage)
        # 按category名称排序,将无分类的页面放在最后
        return qs.order_by(F("category__name").asc(nulls_last=True))

说明

  • super().get_children()确保只获取当前WorkshopIndexPage的直接子页面,而非所有WorkshopPage
  • .specific(WorkshopPage)将QuerySet中的Page实例转换为WorkshopPage实例,才能访问category字段
  • 使用F("category__name").asc(nulls_last=True)处理分类为null的情况,避免排序混乱

内容的提问来源于stack exchange,提问作者fekioh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:13:15