DRF 排序 + 分页出现重复/缺失:稳定排序键的必要性

现象

?ordering=-created_at的分页接口出现翻页后重复或漏项。

原因

仅按非唯一字段排序;同一时间戳的多条记录跨页移动。

修复

为排序增加稳定的次级键:

class OrderViewSet(ModelViewSet):
    queryset = Order.objects.all()
    ordering_fields = ["created_at", "id"]
    ordering = ("-created_at", "-id")  # 稳定排序

或使用 游标分页:

REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.CursorPagination",
    "PAGE_SIZE": 20,
    "CURSOR_PAGINATION_ORDERING": "-created_at,-id",
}

这是我在 gplpal 的 API 规范里强制要求的规则之一。

评论 0