补充 : ORM annotate() 和values() 使用的先后顺序

annotate() 和 values()的先后顺序
models.Score.object.annotate() 就是以 Score的id 进行分组的
models.Score.object.values('course').annotate() 先values后,以course 字段的id进行分组

# 例如:
# ret = models.Score.objects.values('course').annotate(Avg('score')) 相当于告诉电脑以 score 里面的 course_id进行分组
# ret = models.Score.objects.annotate(Avg('score')).values('course','a') 相当于告诉电脑以 score的sid进行分组


order_by()
order_by()里面可以放多个字段,字段的先后顺序便是排列的先后顺序
# 19、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
ret = models.Score.objects.values('course').annotate(a=Avg('score')).order_by('a', '-course__cid')
 
filter() 结合 Q()的使用
字段相同的情况:
1,obj.filter(cid=1,cid=2).values('sid') 如果filter里面表示AND的两个字段相同,会报错
解决办法:
 obj.fiter(cid=1).filter(cid=2).values('sid')


2, obj.filter(Q(cid=1) & Q(cid=2).values('sid) 此时不报错,但是返回空的query set
解决办法:
  obj.filter(cid=1).filter(cid=2).values('sid')




posted @ 2019-03-24 11:15  addit  Views(811)  Comments(0Edit  收藏  举报