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'))