如何在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
相关产品推荐
相关产品推荐

