DEV Community

AJAY SHRESTHA
AJAY SHRESTHA

Posted on

Custom Ordering in Django: Prioritize Your Data

While Developing an application, there's often a need to prioritize items based on specific criteria. Sometimes, these criteria don't follow a natural alphabetical or numerical order. For Example, ticket statuses like "New," "Open," "Pending," "Resolved," "Closed," and "Reopened" need to be ordered in a way that reflects their priority rather than their alphabetical sequence. In such cases, priority-based ordering becomes essential. This blog will guide you through the process of implementing priority-based ordering in Django, using custom criteria to ensure your items are sorted in the most meaningful way for your application.

Creating the Model for Ticket
First, let's define a model for tickets with status choices.

# Creating Model for Ticket
STATUS_CHOICES = [
    ('New', 'New'),
    ('Open', 'Open'),
    ('Pending', 'Pending'),
    ('Resolved', 'Resolved'),
    ('Closed', 'Closed'),
    ('Reopened', 'Reopened'),
]

class Ticket(models.Model
    title = models.CharField(max_length=200)
    description = models.TextField()
    status = models.CharField(
        max_length=10,
        choices=STATUS_CHOICES,
        default=NEW,
    )

    def __str__(self):
        return self.title
Enter fullscreen mode Exit fullscreen mode

Annotating and Ordering the Queryset
To prioritize the ticket statuses, we will use Django's Case and When expressions to annotate the queryset with a custom ordering field. We can then order the queryset based on this custom field.

from django.db.models import Case, When, IntegerField
from app.models import Ticket

# Annotate and order the queryset
tickets = Ticket.objects.annotate(
    ordering = Case(
        When(status='New', then=0),
        When(status='Reopened', then=1),
        When(status='Open', then=2),
        When(status='Pending', then=3),
        When(status='Resolved', then=4),
        When(status='Closed', then=5)
        output_field=IntegerField(),
    )
).order_by('ordering')

Enter fullscreen mode Exit fullscreen mode

In this code, the Case expression is used to assign a numerical value to each status, allowing us to order the tickets according to our custom priority.

Implementing priority-based ordering in Django is straightforward with the use of Case and When expressions. By annotating the queryset with a custom ordering field, you can ensure that your items are sorted according to specific criteria that reflect their importance or priority within your application.
With this approach, you can maintain a logical and meaningful order in your application, improving the usability and effectiveness of your application.

Top comments (0)