2013-09-26 33 views
0

我有以下查询:排序字段可以是空

tasks = tasks.order_by('order_item__due_date', 'title__name') 

然而,order_item可以是NULL,在这种情况下上面的查询将是无效的(因为NULL对象不具有DUE_DATE) 。

在这种情况下,我将如何做到以下几点:

tasks = tasks.order_by('order_item__due_date' if order_item, 'title_name') 
+1

什么类型的数据库?甲骨文?如果是这样,请阅读NVL()或NVL2()。 order by子句可能看起来像这样ORDER BY NVL(order_item,order_item__due_date) –

+0

你试过吗?什么是错误?我只是好奇。 – jproffitt

回答

3

什么错误?如果没有损坏,请不要修复它。 ;)

您可以:

  1. 选择所有任务,而无需order_item和标题排序。
  2. 使用order_item选择所有任务并按order_item__due_date对其进行排序。
  3. 加入两个查询集。

像这样:

tasks = Tasks.objects.all() 
objects_by_title = tasks.objects.filter(order_item__isnull=True).order_by('title') 
objects_by_due_date = tasks.objects.filter(order_item__isnull=False).order_by('order_item__due_date') 
queryset = objects_by_title | objects_by_due_date 

UPDATE:

您的代码将正常工作,即使order_item为空。

tasks = tasks.order_by('order_item__due_date', 'title__name') 

访问是别的东西。这将打印due_dates,直到它到达没有order_item的obj,然后会引发AttributeError:'NoneType'对象没有属性'due_date'。

for obj in tasks: 
    print obj.order_item.due_date