Django自定义order_by

时间:2011-10-01 10:05:02

标签: python django sql-order-by

我有一个模型,例如。带外键的汽车,例如。所有者,可能是空白也可能不是空白。 汽车有一个creation_date。

我想按日期订购这些车,但如果车有车主,则必须取车主的出生日期而不是车的creation_date。

这可能吗?

3 个答案:

答案 0 :(得分:5)

看看这个类似的问题:Good ways to sort a queryset? - Django

您无法使用模型的Meta 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()

获取已排序汽车的所有查询集

答案 1 :(得分:5)

这可以通过回退到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语句。

答案 2 :(得分:1)

您可以编写一个返回相应日期的方法(如果汽车有所有者返回生日,则返回creation_date),然后order your model based on this method.