Django 过滤相关对象的聚合

Django 过滤相关对象的聚合,django,django-queryset,Django,Django Queryset,我试图通过相关对象的特征来计算符合条件和组的对象。例如,如果我有一组这样的模型: 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): a

我试图通过相关对象的特征来计算符合条件和组的对象。例如,如果我有一组这样的模型:

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)
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;
我想获得每个办公室成功的预约次数,我可以执行一个原始SQL查询,如下所示:

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)
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聚合和注释函数得到这个结果,但是在阅读了文档之后,我认为不可能基于相关对象的字段进行聚合,但我想问一下,万一我遗漏了什么。

这个怎么样:

Office.objects.filter(
    staff__appointment__result='success'
).values('name').annotate(appointments=models.Count('staff__appointment'))