js css html

[Django] order_by 的副作用

2022-05-30  本文已影响0人  alue

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()
上一篇 下一篇

猜你喜欢

热点阅读