我正在尝试对查询集进行排序,以便:
- 查询集的第一个元素是那些将外键布尔属性(
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',
)