通过额外字段注释

时间:2013-11-19 15:57:36

标签: django django-models group-by

我有这个型号:

class Place(models.Model):
  name = models.CharField()
  price= models.IntegerField()

我想获得一系列机构的第一封信:

places = Place.objects.all() 
places = places.extra(select={'group_field':'LCASE(SUBSTRING(places_place.name, 1, 1))'})
places = places.values('group_field')
places = places.annotate(count=Count('group_field'))

或者获取价格清单:

places = Place.objects.all()
places = place.extra(select={'group_field':'IF(price<200, \'<200\', \'>=200\')'})
places = places.values('group_field')
places = places.annotate(count=Count('group_field'))

我收到错误«无法解析关键字'group_field'到字段中。选择是:名称»。

如何按额外字段对地点进行分组,并按每个字母计算计数?

2 个答案:

答案 0 :(得分:2)

places = places.values('first_letter').annotate(count=Count('id')).order_by()

&#39; ORDER_BY()&#39;是您的点票所必需的,请参阅此处https://docs.djangoproject.com/en/1.7/topics/db/aggregation/#order-by

答案 1 :(得分:0)

您应该使用不同位置的数量进行注释(具有相同的第一个字母):

p = Place.objects.all()
p = p.extra(select={'first_letter': 'SUBSTR(name,1,1)'})
p = p.values('first_letter').annotate(count=Count('id'))

您必须选择要注释哪个字段对每个地方都是唯一的字段。所以ID是最合适的。

Interesting与注释一起使用的values方法的行为:

  

如果values()子句位于annotate()之前,则将使用values()子句描述的分组计算注释。