按字段排序可能为空

时间:2013-09-26 20:22:25

标签: sql django

我有以下查询:

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 个答案:

答案 0 :(得分:3)

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

你可以:

  1. 选择没有order_item的所有任务,并按标题对其进行排序。
  2. 使用order_item选择所有任务,并按order_item__due_date对其进行排序。
  3. 加入两个查询集。
  4. 像这样:

    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
    

    <强>更新

    即使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