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

