我有一个模型,例如。带外键的汽车,例如。所有者,可能是空白也可能不是空白。 汽车有一个creation_date。
我想按日期订购这些车,但如果车有车主,则必须取车主的出生日期而不是车的creation_date。
这可能吗?
答案 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.