【问题标题】:Django ORM Annotate Count Items and Order by Specific Order?Django ORM注释计数项目并按特定顺序排序?
【发布时间】:2021-11-15 09:51:21
【问题描述】:

我有一张图表,显示了按地区划分的不同许可类型以及每个地区有多少有效许可。有没有办法在查询集中按特定顺序对项目进行排序以输出到图表?

这些是我的模型:

class Licence(models.Model):
    status = models.CharField(choices=STATUS, max_length=1000)
    number = models.CharField(unique=True, max_length=1000)
    licence_type = models.ForeignKey(
        "LicenceType", on_delete=models.SET_NULL, null=True
    )

class LicenceType(models.Model):
    region = models.ForeignKey(
        "Region", on_delete=models.SET_NULL, null=True
    )

class Region(models.Model):
    slug = models.SlugField(primary_key=True)

这是我的看法:

def dashboard(request):
    # total number of active licences across regions
    active_licences = (
        Licence.objects.values("licence_type", "licence_type__region")
        .annotate(total=Count("id"))
        .order_by("licence_type")
    )
    return render(request, "dashboard.html", "active_licences": active_licences)

有没有一种方法可以指定区域出现的顺序?例如,它们当前的顺序是(按 pk)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],但我希望它们显示为 [1, 3, 2, 4, 5, 6, 7, 8, 9, 10]

【问题讨论】:

  • 看来您目前正在通过licence_type 订购。你能解释一下想要的顺序吗?
  • 现在它们只是按 pk 排序,但客户希望按特定顺序查看区域/省,所以我需要能够对它们进行排序,以便“ON”在前,“ AB”是第二个,“BC”是第三个,等等。而不是“ON”、“BC”、“AB”等。
  • 基本上我想优先考虑前三个,然后以任何顺序显示其余的。

标签: django sql-order-by django-orm django-annotate


【解决方案1】:

我最终在视图中处理来自查询集的数据并将其作为元组列表返回到模板,如下所示:

def dashboard(request):
    # total number of active licences across provinces
    licences_by_province = list(
        Licence.objects.values("licence_type__region")
        .annotate(total=Count("id"))
        .order_by("licence_type")
    )

    # save provinces and totals to a list
    licence_list = []
    for province in licences_by_province:
        licence_list.append(tuple(province.values()))

    # re-order list to include ON, AB, BC at the beginning
    d = dict([('ON', 0), ('AB', 0), ('BC', 0)])
    d.update(dict(licence_list))
    active_licences = list(d.items())

    return render(request, "dashboard.html", "active_licences": active_licences)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多