Django queryset:order_by ForeignKey布尔值属性

时间:2019-06-05 15:12:14

标签: python django

我正在尝试订购查询集,以便:

  • 查询集中的第一个元素是那些将ForeignKey布尔属性(first)设置为True的元素,其中,它们按创建日期排序
  • 以下元素是将ForeignKey first属性设置为False的元素,在这些元素中,它们的创建日期也是相同的

以下是模型的示例:

class A(models.Model):
    first = models.BooleanField(blank=False, default=False)

class B(models.Model):
    a = models.ForeignKey(A)
    created = models.DateTimeField(auto_now_add=True)

查询集如下:

queryset = B.objects.all().order_by("-a__first", "-created")

但是,此窥探器无法完成工作。

我正在考虑的解决方案是使用两个不同的数据库调用(一个过滤a__first = True,另一个过滤a__first = False),然后对查询集结果求和。但我想了解是否有更好,更清洁的方法来解决此问题。

1 个答案:

答案 0 :(得分:0)

尝试以下条件查询,可能会起作用

from django.db.models import Case, When

B.objects.annotate(
    first_true=Case(
        When(a__first=True, then=('created')),
        default=None
    ),
    first_false=Case(
        When(a__first=False, then=('created')),
        default=None
    )
).order_by(
    '-first_true',
    '-first_false',
)