Django ORM 使用 order_by 语句实现查询的排序,但它有些副作用,需要清楚的理解,否则就会出现莫名其妙的问题。
例如,有时候出现用 distinct() 过滤重复的行时,会发现返回结果仍然有重复的。如果在查询语句上级联 order_by(),就能够去除重复。
这个现象就是order_by()的副作用 —— 任何order_by()中的字段,都会放在SQL SELECT的列中。这就导致了原本是重复的行,加上order_by()中的字段之后,就变得不重复了。
举一个列子,我们在model中增加排序字段 -id.
class Leave(models.Model):
class Meta:
verbose_name = "请假单"
ordering = ['-id']
student = models.CharField('申报人', max_length=4)
days = models.PositiveSmallIntegerField(verbose_name='天数', default=0)
如果我们想用 Leave.objects.distict('student'),就会发现该student的所有行都被返回了,这是因为,实际上这里执行的是二元组 ('id','student') 的重复检测,这里所有行的二元组都是唯一的。
同样的道理,如果我们用聚合函数
Leave.objects.values('student').annotate(Sum('days'))
会发现,并不能求出每个学生的请假天数,只有加上 .order_by(), 让排序字段为空之后,才能得到想要的结果。这个原因跟之前是一致的。
Leave.objects.values('student').annotate(Sum('days')).order_by()







网友评论