[英]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.