django - 基于场计算的注释

时间:2011-02-11 08:21:12

标签: django annotations

是否可以根据其他字段使用计算(不是平凡的总和\ max \ min \ count)来注释对象?

示例:

  • 根据添加了特定时间间隔的现有TimeField字段添加时间注释字段
  • 添加基于两个IntegerFields字段的特定计算的整数注释

至少某些情况的解决方法(例如,两个示例中的第一个)将具有不保存的update()命令。这将允许我更改QuerySet中的某个字段,并在本地使用它而不更改数据库中的条目。唉,AFAIK update()总是保存。

解决方案当然是列出查询集并使用列表推导添加字段,但我希望有更多的djangoic方法。

1 个答案:

答案 0 :(得分:0)

我只是使用RawSQL annotation做了这种事(如果我正确理解的话):

queryset = City.objects.annotate(distance=
        RawSQL('sqrt(((%s - latitude)/0.010)^2 + ((%s - longitude)/0.015)^2)',
               (latitude, longitude))) \
    .filter(distance__lte=radius) \
    .order_by('distance')

它用类似于它们到某一点的距离(直接通过地球和其他古怪的假设,但这与这个问题无关)来注释城市。

如果您不需要注释(此处为distance)在同一查询中进行过滤,您通常可以在模型类上实现属性。