刚开始开发博客的时候,本来想让博客按照阅读量,评论量,赞成数等属性,根据某个计算公式计算结果来排序,但后来因为在Django的ORM里不知道怎么写,又不想混杂一些SQL语句,所以一直没有实现。到了现在,想想通过ORM来实现,还是无法做到的。因为Django的QUERYSET里,根据几个属性的计算(如:分别求出各个属性值的比例,再求和,最后按照比例再除法或更复杂的计算)结果去filter,或order by,是无法做到的。
现在想想,如果在models里,建立一个子def(自定义属性),专门负责几个内置属性的计算,返回结果。这样就相当是models实例的一个属性了,然后再在QUERYSET里排序,不就好了吗?可是仔细想想,还是不行,这样只是降低QUERYSET语句写法的复杂性,最后的order by还是取不到实例的子def(自定义属性)的返回值。最终还是回到原点了。
最后,想到一个不是很地道的办法,那就是使用原生python的sorted()函数:
object_list = sorted(Blog.objects.all(), key=lambda blog: blog.cir_val,reverse=True)
这样就解决了。
models里需要先定义一个自定义属性cir_val,根据某个算法把几个内置属性组合结果算出来。形如:
def cir_val(self):
return self.browse*1/5+self.comment*2/5+self.zan*3/5
一时的思维掠过,我也不知道自己在写什么,总之解决了我一年来,来不及想的问题,只是不知道怎么表达问题罢了。
现在想想,如果在models里,建立一个子def(自定义属性),专门负责几个内置属性的计算,返回结果。这样就相当是models实例的一个属性了,然后再在QUERYSET里排序,不就好了吗?可是仔细想想,还是不行,这样只是降低QUERYSET语句写法的复杂性,最后的order by还是取不到实例的子def(自定义属性)的返回值。最终还是回到原点了。
最后,想到一个不是很地道的办法,那就是使用原生python的sorted()函数:
object_list = sorted(Blog.objects.all(), key=lambda blog: blog.cir_val,reverse=True)
这样就解决了。
models里需要先定义一个自定义属性cir_val,根据某个算法把几个内置属性组合结果算出来。形如:
def cir_val(self):
return self.browse*1/5+self.comment*2/5+self.zan*3/5
一时的思维掠过,我也不知道自己在写什么,总之解决了我一年来,来不及想的问题,只是不知道怎么表达问题罢了。