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