class Order(models.Model):
...
class OrderApplication(models.Model):
created_at = models.DateTimeField(auto_now=True)
driver = models.ForeignKey(Driver, on_delete=models.CASCADE)
suggested_price = models.DecimalField(..., blank=True, null=True)
我有上述的模型。所有的订单通常有1个以上的订单应用(OA)。但是,每个订单只有一个OA,它有一个非空的 suggested_price
字段。在某些时刻,我必须序列化一个订单列表,并将其发送到前端React应用程序。我希望我的订单被放置在一个非常特定的订单中。
suggested_price
领域created_at
领域suggested_price
并尽可能在最近创建我已经尝试过的是按照第一次创建的OA相关的订单进行排序。
.annotate(suggestion_created=Min('orderapplication__created_at')).order_by("-suggestion_created")
在这里 Min
聚合器,我使用了订单的反向外链关系,它可以被访问为 orderapplication
并得到处于这个反向关系中的对象的第一个日期。然而,问题是,与任何订单相关的第一个OA并不总是真的有 suggested_price
指定(尽管这是最常见的情况),但可能是第2个、第3个或其他的情况。我也试过用 filter
参数的 Min
然而,事实证明,这个过滤器是应用于订单本身,而不是应用于反向关系。我认为一个可能的解决方案是使用一些可以过滤反向关系的聚合函数,但是,我还没有找到这样一个函数
你可以在 orderapplication
也是。
from django.db.models import Q
Order.objects.annotate(
suggestion_created=Min(
'orderapplication__created_at',
filter=Q(orderapplication__suggested_price__isnull=False)
)
).order_by('-suggestion_created')
或者你可以简单地把这个放在 .order_by
条款。如果没有这样的 orderapplication
该值将是 NULL
因此,你应该决定是否要 NULL
拟 第一 或 最后的:
from django.db.models import Q
Order.objects.order_by(
Min(
'orderapplication__created_at',
filter=Q(orderapplication__suggested_price__isnull=False)
).desc(nulls_last=True)
)