Custom Sorting on Custom Field in Django

Posted by RotaJota on Stack Overflow See other posts from Stack Overflow or by RotaJota
Published on 2012-03-28T16:57:39Z Indexed on 2012/03/28 17:30 UTC
Read the original article Hit count: 386

In my app, I have defined a custom field to represent a physical quantity using the quantities package.

class AmountField(models.CharField):
    def __init__(self, *args, **kwargs):
        ...

    def to_python(self, value):
        create_quantities_value(value)

Essentially the way it works is it extends CharField to store the value as a string in the database

"12 min"

and represents it as a quantities object when using the field in a model

array(12) * min

Then in a model it is used as such:

class MyModel(models.Model):
    group = models.CharField()
    amount = AmountField()

    class Meta:
        ordering = ['group', 'amount']

My issue is that these fields do not seem to sort by the quantity, but instead by the string.

So if I have some objects that contain something like

  • {"group":"A", "amount":"12 min"}
  • {"group":"A", "amount":"20 min"}
  • {"group":"A", "amount":"2 min"}
  • {"group":"B", "amount":"20 min"}
  • {"group":"B", "amount":"1 hr"}

they end up sorted something like this:

>>> MyModel.objects.all()
[{A, 12 min}, {A, 2 min}, {A, 20 min}, {B, 1 hr}, {B, 20 min}]

essentially alphabetical order.

Can I give my custom AmountField a comparison function so that it will compare by the python value instead of the DB value?

© Stack Overflow or respective owner

Related posts about python

Related posts about django