Django custom order_by - PullRequest
       20

Django custom order_by

5 голосов
/ 01 октября 2011

У меня есть модель, например.Автомобиль с иностранным ключом например.Владелец, который может быть или не быть пустым.Автомобиль имеет дату создания.

Я хотел бы заказать эти автомобили по дате, но если у автомобиля есть владелец, вместо даты создания автомобиля должна быть взята дата рождения владельца.

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 01 октября 2011

Посмотрите на этот похожий вопрос: Хорошие способы сортировки набора запросов?- Django

Вы не можете использовать мета ordering модели, так как она принимает только одно поле

https://docs.djangoproject.com/en/dev/ref/models/options/#ordering

Вы не можете использовать запросorder_by('creation_date', 'birthdate'), поскольку он сортирует только по дате рождения, если они имеют одинаковые creation_date

Таким образом, вы можете написать собственный менеджер, который будет включать в себя пользовательскую сортировку для вас.

import operator
class CarManager(models.Manager):
    def get_query_set(self):
        auths = super(CarManager, self).get_query_set().all().order_by('-creation')
        ordered = sorted(auths, key=operator.attrgetter('birthday'))
        return ordered

class Car(models.Model):
    sorted = CarManager()

так что теперь вы можете запросить:

Car.sorted.all()

, чтобы получить весь набор запросов отсортированного автомобиля

5 голосов
/ 02 октября 2011

Это возможно, если вернуться к SQL:

Car.objects.filter(...).extra(select={'odate': '''
  if(owner_id,
     (select date_of_birth from owner_table where id=owner_id),
     creation_date
  )
'''}).order_by('odate')

if - специфичная для MySQL функция.В случае SQLite или Postgres вы должны использовать оператор case.

1 голос
/ 01 октября 2011

Вы могли бы написать метод, который возвращает соответствующую дату (если у владельца автомобиля есть день рождения, в противном случае возвращается creation_date), а затем закажите вашу модель на основе этого метода.

...