Django 用复杂的值注释

Django annotate with complex value

是否可以用复数值标注?

如果我有 table

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

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

No, annotations can only be done on django aggregations.

Annotates each object in the QuerySet with the provided list of aggregate values (averages, sums, etc) that have been computed over the objects that are related to the objects in the QuerySet.

不,您不能将数学函数传递给 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'))

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

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

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