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

Django ORM使用Annotate计数后如何按指定顺序排列Region?

解决方案

方案1:无需修改模型,使用自定义排序逻辑(适合固定排序规则)

你可以通过Django的Case/When条件表达式给不同地区分配自定义排序权重,实现你要的[1,3,2,4,5,...]顺序。

首先导入需要的依赖:

from django.db.models import Count, Case, When, IntegerField

修改后的视图代码如下:

def dashboard(request):
    # 按你需要的顺序填写对应地区的slug值即可调整排序
    custom_region_order = [1,3,2,4,5,6,7,8,9,10]
    # 生成自定义排序权重规则
    order_case = Case(
        *[When(licence_type__region=slug, then=idx) for idx, slug in enumerate(custom_region_order)],
        output_field=IntegerField()
    )
    # 统计各地区有效许可证总数量
    active_licences = (
        Licence.objects.values("licence_type", "licence_type__region")
        .annotate(
            total=Count("id"),
            region_order=order_case
        )
        .order_by("region_order", "licence_type") # 先按自定义地区顺序排,再按许可证类型排序
    )
    return render(request, "dashboard.html", {"active_licences": active_licences})

方案2:新增排序字段(适合需要灵活调整排序的场景)

如果后续可能频繁调整地区排序,建议直接给Region模型增加排序字段,后续维护更简单:

  1. 修改Region模型定义:
class Region(models.Model):
    slug = models.SlugField(primary_key=True)
    sort_order = models.IntegerField(default=0, verbose_name="排序权重", help_text="数值越小,排序越靠前")
  1. 执行迁移命令同步数据库变更:
python manage.py makemigrations
python manage.py migrate
  1. 在后台给各个地区设置对应排序权重(比如你要的顺序里,地区1权重设为1,地区3权重设为2,地区2权重设为3,以此类推)
  2. 修改查询的排序规则即可:
active_licences = (
    Licence.objects.values("licence_type", "licence_type__region")
    .annotate(total=Count("id"))
    .order_by("licence_type__region__sort_order", "licence_type")
)

这种方案不需要修改业务代码,直接在后台调整权重就能修改排序,适配性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:27:04