繁体   English   中英

Django:返回最大值的id,按外键分组

[英]Django: Return id of maximum value where grouped by foreign key

信息

我有两个模型:

class BookingModel(models.Model):

    [..fields..]


class BookingComponentModel(models.Model):
    STATUS_CHOICES = ['In Progress','Completed','Not Started','Incomplete','Filled','Partially Filled','Cancelled']
    STATUS_CHOICES = [(choice,choice) for choice in STATUS_CHOICES]
    COMPONENT_CHOICES = ['Test','Soak']
    COMPONENT_CHOICES = [(choice,choice) for choice in COMPONENT_CHOICES]

    booking = models.ForeignKey(BookingModel, on_delete=models.CASCADE, null=True, blank=True)
    component_type = models.CharField(max_length=20, choices=COMPONENT_CHOICES)
    status = models.CharField(max_length=50, choices=STATUS_CHOICES, default='Not Started')
    order = models.IntegerField(unique=True)

    [..fields..]

我想要的是

我想获取每个预订的预订组件,该组件按顺序具有最后一个值(最大值) 它还需要一个status='In Progress'component_type='Soak'

例如表:

+----+------------+----------------+-------------+-------+
| id | booking_id | component_type | status      | order |
+----+------------+----------------+-------------+-------+
| 1  | 1          | Test           | Completed   | 1     |
+----+------------+----------------+-------------+-------+
| 2  | 1          | Soak           | Completed   | 2     |
+----+------------+----------------+-------------+-------+
| 3  | 1          | Soak           | In Progress | 3     |
+----+------------+----------------+-------------+-------+
| 4  | 2          | Test           | Completed   | 1     |
+----+------------+----------------+-------------+-------+
| 5  | 2          | Soak           | In Progress | 2     |
+----+------------+----------------+-------------+-------+
| 6  | 3          | Test           | In Progress | 1     |
+----+------------+----------------+-------------+-------+

预期结果将是 id's: 4 & 6

我试过的

我尝试了以下方法:

BookingComponentModel.objects.values('booking').annotate(max_order=Max('order')).order_by('-booking')

这不包括过滤,但返回每个预订的 max_order。

我需要具有该max_order的组件的 id 以便将其放在子查询中并使我能够过滤其他条件(状态、组件类型)

谢谢

您可以使用Subquery表达式 [Django-doc]并使用:

from django.db.models import OuterRef, Subquery

BookingModel.objects.annotate(
    latest_component_id=Subquery(BookingComponentModel.objects.filter(
        booking_id=OuterRef('pk'), status='In Progress', component_type='Soak'
    ).values('pk').order_by('-order')[:1])
)

BookingModel产生的BookingModel对象将有一个额外的属性latest_component_id ,该属性将包含最新BookingComponentModel的主键, status 'In Progress'component_type 'Soak'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM