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:
- (MODEL LEVEL) Meta attribute
ordering
as shows @Bithin in his answer (more on django docs) (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.- (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.