Вот как я это сделал в недавнем проекте Django:
from django.db import models
SomeClass(models.Model):
title = models.CharField()
@property
def alphabetical_title(self):
"""
Returns an alphabetical-friendly string of a title attribute.
"""
title = self.title
# A list of flags to check each `title` against.
starts_with_flags = [
'the ',
'an ',
'a '
]
# Check each flag to see if the title starts with one of it's contents.
for flag in starts_with_flags:
if title.lower().startswith(flag):
# If the title does indeed start with a flag, return the title with
# the flag appended to the end preceded by a comma.
return "%s, %s" % (title[len(flag):], title[:len(flag)-1])
else:
pass
# If the property did not return as a result of the previous for loop then just
# return the title.
return self.title
Поскольку это свойство, а не фактический столбец в базе данных, мне нужно сначала получить QuerySet, а затем отсортировать его по факту.в представлении.Вот как я это сделал:
from operator import attrgetter
from someapp.models import SomeClass
some_objects = SomeClass.objects.all()
sorted_objects = sorted(some_objects, key=attrgetter('alphabetical_title'), reverse=False)
Я уверен, что вы уже давно нашли решение, но я подумал, что это может помочь опубликовать его в любом случае, так как кто-то еще в будущем может столкнуться с этой же проблемой.