Django框架models使用group by詳解
Django框架models使用group by詳解:
首先,看下列程式碼:
UserData.objects.filter(hubid=sensorid,time__range=(time2,time1)).values('hour').annotate(sum_out=Sum('outdoor'),sum_in=Sum('indoor'),sum_eat=Sum('kitchen'),sum_wash=Sum('toilet')).order_by('hour')
上述程式碼相當於sql語句:
select Sum('outdoor') as sum_out,Sum('indoor') as sum_in,Sum('kitchen') as sum_eat,Sum('toilet') as sum_wash,hour
where hubid='sensorid' and (time between time1 and time2)
group by hour
order by hour asc
另外,在Django中order_by(‘hour')表示按生序排列,若要按降序排列,則使用order_by(‘-hour')
補充知識:django模型orm進行group by
場景:三個模型分別為教師,學生,課程。一個教師可主講多門課程,但一門課程只能由一個教師主講,即教師和課程是一對多的關係。一個學生可選多門課程,一門課程可被多個學生選,即學生和教師為多對多的關係。
class Teacher(models.Model): name = models.CharField(max_length=20,verbose_name='教師姓名') def __unicode__(self): return self.name class Student(models.Model): name = models.CharField(max_length=20,verbose_name='學生姓名') def __unicode__(self): return self.name class Course(models.Model): name = models.CharField(max_length=20,verbose_name='課程名') teacher = models.ForeignKey(Teacher,verbose_name='主講人') student = models.ManyToManyField(Student,verbose_name='選課學生') def __unicode__(self): return self.name
選取某教師主講的pk最小的課:
Teacher.objects.annotate(Min('course__pk')).get(pk=2).course__pk__min
多對多也一樣
這個例子不太典型,比如快遞和其狀態兩張表是一對多關係,查最新的狀態就可以使用這種方法(也可以在有新的狀態時在快遞表中每次更新最新的狀態)
以上這篇Django框架models使用group by詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。