[Django]-Django: How to write query to sort using multiple columns, display via template

76👍

There are several levels for display ordered models objects in template, each one overwrite the previous level:

  1. (MODEL LEVEL) Meta attribute ordering as shows @Bithin in his answer (more on django docs)
  2. (VIEW LEVEL) QuerySet order_by method as you have tried in your view example, which would works
    as you want if add other fields to sort:

    Customer.objects.order_by('state', 'city_name', 'customer_name')

    (more on django docs). Note that .all() is not needed here.

  3. (TEMPLATE LEVEL) regroup template tag need to use nested in your sample (more on django docs)

13👍

You can specify the ordering inside the model,

class Customer(models.Model):

    customer_name = models.CharField(max_length=60)
    city_name = models.CharField(max_length=30)
    state = models.ForeignKey('State')

    def __unicode__(self):
        return self.customer_name

    class Meta:
           ordering = ['customer_name', 'city_name', 'state']

Hope this helps.

👤Bithin

2👍

If you want to order by some field of the “master” model, in this case state, you must write something like this:

Customer.objects.order_by('state__state_name', 'city_name', 'customer_name')

Take a look of state__state_name, the double _ after the first state, make access to the field of that model.

Leave a comment