已过滤的相关对象的聚合

问题描述 投票:0回答:1

我正在尝试通过相关对象的特征来计算与标准和组匹配的对象。例如,如果我有一组这样的模型:

class Office(User):
    name = models.CharField(max_length=50)
    city = models.CharField(max_length=50)

class Staff(User):
    home_office = models.ForeignKey(Office)

class Appointment(models.Model):
    appt_start = models.DateTimeField()
    appt_end = models.DateTimeField()
    client = models.ForeignKey(User)
    provider = models.ForeignKey(Staff)
    result = models.CharField(max_length=50)

我希望得到每个办公室“成功”的约会数量,我可以像这样做一个原始的SQL查询:

SELECT office.name, COUNT(appointment.id)
    FROM appointment
        JOIN staff ON staff.id = appointment.provider_id
        JOIN office ON office.id = staff.home_office_id
    WHERE appointment.result = 'success' GROUP BY office.name;

如果可能的话,我更喜欢使用ORM和Django的QuerySet聚合和注释函数来获得这个结果,但是在阅读文档之后我认为不可能基于相关对象的字段进行聚合但是我想问我以防万一我错过了什么。

django django-queryset
1个回答
0
投票

这个怎么样:

Office.objects.filter(
    staff__appointment__result='success'
).values('name').annotate(appointments=models.Count('staff__appointment'))
© www.soinside.com 2019 - 2024. All rights reserved.