Django ORM Annotate Count Items and Order by Specific Order?

У меня есть график, показывающий различные типы лицензий по регионам и количество активных лицензий в каждом регионе. Есть ли способ упорядочить элементы в определенном порядке в наборе запросов для вывода на график?

Вот мои модели:

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)

Есть ли способ указать порядок, в котором появляются регионы? Например, сейчас они расположены в порядке (по пк) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], но я хочу, чтобы они отображались как [1, 3, 2, 4, 5, 6, 7, 8, 9, 10].

В итоге я манипулировал данными из кверисета в представлении и возвращал их в шаблон в виде списка кортежей следующим образом:

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)
Вернуться на верх