Django注释具有复杂的价值

时间:2015-01-27 22:29:08

标签: django django-queryset

是否可以使用复杂值进行注释?

就像我有桌子一样

class Test(models.model):
   value = models.PositiveIntegerField(_('value'))

next = 5
import math
Test.objects.annotate(new_field=math.sqrt(next-value)/math.atan(value))

2 个答案:

答案 0 :(得分:2)

不,你不能将数学函数传递给annotate()

如果您想在Test模型中进行此计算,请创建一个方法:

class Test(models.model):
    value = models.PositiveIntegerField(_('value'))

    def calc_value(self, next):
        return math.sqrt(next-self.value)/math.atan(self.value))

for t in Test.objects.all():
    print t.value. t.calc_value(5)

但是如果你想使用这个计算来对查询集进行排序,那么你必须在SQL level进行数学计算:

next = 5
Test.objects.extra(select={'new_field': 'SQRT(%d-value)/ATAN(value)' % next}) \
            .order_by('new_field'))

要按新字段过滤查询集,请使用相同where方法的extra()参数:

Test.objects.extra(select={'new_field': 'SQRT(%d-value)/ATAN(value)' % next},
                   where=['new_field > 10'])

默认情况下,SQLite不支持数学函数,但是对于Postgres和MySQL,这段代码应该可以正常工作。

答案 1 :(得分:0)

No, annotations can only be done on django aggregations.

  

使用提供的与QuerySet中的对象相关的对象计算的聚合值(平均值,总和等)列表,为QuerySet中的每个对象添加注释。