我想查找商品价格的频率,例如糖。
糖会有不同的价格,如糖的项目价格:100,120,100,130,100,140。
我如何在django视图中执行此操作?
以下是我的模特:
class Costs(models.Model):
itemname = models.CharField(max_length=200)
unitcost = models.IntegerField()
weight = models.IntegerField(default = 1)
dateprovided = models.DateTimeField(default = timezone.now)
location = models.CharField(max_length=200)
retailer = models.CharField(max_length=200, default='Nakumatt')
def __unicode__(self):
return self.itemname
答案 0 :(得分:2)
from django.db.models import Count
ok = set(Costs.objects.all().values_list("itemname","unitcost").annotate(freq=Count("itemname","unitcost")))
这将获取所有项目名称和单位成本,添加它们唯一对出现次数的频率计数,并将列表展平为一组(删除任何重复的条目)。 annotate
将聚合函数(Count
)的结果添加到此列表中,该列表返回此结构:
[('sugar', 120, 1), ('sugar', 150, 4), ('something_else', 105, 10),]
现在您有一个(itemname,price,frequency)
的3值元组列表。当然,如果在此之前仅过滤特定itemname
的查询集,您仍然可以执行此功能。
或者,保留在查询集中
ok = Costs.objects.all().annotate(frequency=Count("itemname","unitcost"))
会为查询集.frequency
中的每个模型实例添加ok
属性,您可以在视图或模板中调用该属性。
请注意:您可能使用此特定方法有多个相同的itemname
和unitcost
集合,并且由于Django ORM的限制,您可能无法解析每个唯一组合而无需转换您的查询集到另一种数据类型。