Django queryset:order_by ForeignKey 布尔属性



我正在尝试对查询集进行排序,以便:

  • 查询集的第一个元素是那些将外键布尔属性(first(设置为True的元素,其中,它们按创建日期排序
  • 以下元素是那些将外键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(,然后汇总查询集结果。但我想了解是否有更好、更清洁的方法来解决这个问题。

尝试以下条件查询,它可能有效

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',
)

最新更新