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

Wagtail API默认按-first_published_at排序问题求助

Wagtail API 默认按发布时间倒序配置问题

需求

使用Wagtail框架完成API序列化配置后,希望用户访问api/v2/pages时,无需通过URL参数过滤,默认按-first_published_at(最新发布内容优先)返回有序数据。

现有代码(api.py)

class ProdPagesAPIViewSet(BaseAPIViewSet):
    renderer_classes = [JSONRenderer]
    filter_backends = [FieldsFilter,
        ChildOfFilter,
        AncestorOfFilter,
        DescendantOfFilter,
        OrderingFilter,
        TranslationOfFilter,
        LocaleFilter,
        SearchFilter,]
    meta_fields = ["type","seo_title","search_description","first_published_at"]
    body_fields = ["id","type","seo_title","search_description","first_published_at","title"]
    listing_default_fields = ["type","seo_title","search_description","first_published_at","id","title","alternative_title","news_slug","blog_image","video_thumbnail","categories","blog_authors","excerpt","content","content2","tags",]
    nested_default_fields = []
    ordered_queryset= [] 
    name = "pages"
    model = AddStory

api_router.register_endpoint("pages", ProdPagesAPIViewSet)

无效尝试

曾尝试设置ordered_queryset= [AddStory.objects.order_by('-first_published_at')],但未实现预期排序效果。

解决方案

方法一:利用ordering属性(推荐)

Wagtail的API ViewSet集成了Django REST Framework的OrderingFilter,可直接通过ordering属性指定默认排序规则:

修改ProdPagesAPIViewSet,添加ordering字段:

class ProdPagesAPIViewSet(BaseAPIViewSet):
    renderer_classes = [JSONRenderer]
    filter_backends = [FieldsFilter,
        ChildOfFilter,
        AncestorOfFilter,
        DescendantOfFilter,
        OrderingFilter,
        TranslationOfFilter,
        LocaleFilter,
        SearchFilter,]
    meta_fields = ["type","seo_title","search_description","first_published_at"]
    body_fields = ["id","type","seo_title","search_description","first_published_at","title"]
    listing_default_fields = ["type","seo_title","search_description","first_published_at","id","title","alternative_title","news_slug","blog_image","video_thumbnail","categories","blog_authors","excerpt","content","content2","tags",]
    nested_default_fields = []
    # 指定默认排序规则:按first_published_at倒序
    ordering = ['-first_published_at']
    # 可选:允许用户通过URL参数修改排序的字段(按需开启)
    # ordering_fields = ['first_published_at', 'title']
    name = "pages"
    model = AddStory

api_router.register_endpoint("pages", ProdPagesAPIViewSet)

方法二:重写get_queryset方法

如果需要更灵活的查询逻辑,可重写get_queryset方法返回预先排序后的查询集:

class ProdPagesAPIViewSet(BaseAPIViewSet):
    renderer_classes = [JSONRenderer]
    filter_backends = [FieldsFilter,
        ChildOfFilter,
        AncestorOfFilter,
        DescendantOfFilter,
        OrderingFilter,
        TranslationOfFilter,
        LocaleFilter,
        SearchFilter,]
    meta_fields = ["type","seo_title","search_description","first_published_at"]
    body_fields = ["id","type","seo_title","search_description","first_published_at","title"]
    listing_default_fields = ["type","seo_title","search_description","first_published_at","id","title","alternative_title","news_slug","blog_image","video_thumbnail","categories","blog_authors","excerpt","content","content2","tags",]
    nested_default_fields = []
    name = "pages"
    model = AddStory

    def get_queryset(self):
        # 重写查询集,按first_published_at倒序排列
        queryset = super().get_queryset()
        return queryset.order_by('-first_published_at')

api_router.register_endpoint("pages", ProdPagesAPIViewSet)

说明

之前使用ordered_queryset无效的原因是:Wagtail的BaseAPIViewSet并不识别该属性,正确配置需借助DRF的ordering属性或重写get_queryset方法。

配置完成后,访问api/v2/pages时,返回的items列表会自动按first_published_at从新到旧排序。


内容的提问来源于stack exchange,提问作者Mohammad Fathi Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:55:25