Django: How to write query to sort using multiple columns, display via template Django: How to write query to sort using multiple columns, display via template postgresql postgresql

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


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)


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.


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.