簡體   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