是否可以使用复杂值进行注释?
就像我有桌子一样
class Test(models.model):
value = models.PositiveIntegerField(_('value'))
next = 5
import math
Test.objects.annotate(new_field=math.sqrt(next-value)/math.atan(value))
答案 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中的每个对象添加注释。