Django在过滤后的反向外文字段上的最小值集合。

问题描述 投票:0回答:1
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应用程序。我希望我的订单被放置在一个非常特定的订单中。

  1. 对于每个订单,我想得到与之相关的OA,并有一个非空的。suggested_price 领域
  2. 那么当我拿到这个OA时,我想检查一下它的 created_at 领域
  3. 根据这个字段,OA创建的时间越早,下单的时间就越接近尾声。因此,第一个订单将是有指定OA的订单。suggested_price 并尽可能在最近创建

我已经尝试过的是按照第一次创建的OA相关的订单进行排序。

.annotate(suggestion_created=Min('orderapplication__created_at')).order_by("-suggestion_created")

在这里 Min 聚合器,我使用了订单的反向外链关系,它可以被访问为 orderapplication 并得到处于这个反向关系中的对象的第一个日期。然而,问题是,与任何订单相关的第一个OA并不总是真的有 suggested_price 指定(尽管这是最常见的情况),但可能是第2个、第3个或其他的情况。我也试过用 filter 参数的 Min然而,事实证明,这个过滤器是应用于订单本身,而不是应用于反向关系。我认为一个可能的解决方案是使用一些可以过滤反向关系的聚合函数,但是,我还没有找到这样一个函数

django django-models foreign-keys aggregate
1个回答
1
投票

你可以在 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)
)
© www.soinside.com 2019 - 2024. All rights reserved.