我必须上这样的课
class JobTitle(models.Model):
name = models.CharField(max_length=500,null=False,blank=False)
class Employer(models.Model):
name = models.CharField(max_length=500,null=False,blank=False)
jobtitle = models.ForeignKey(JobTitle,null=False)
revenue = models.IntegerField(null=False)
首先,我想要获得雇主数量最多的前5个职位,其次,我需要评估这5个职位的雇主的平均收入。
我可能会得到前5个职位头衔,比如
jtList = JobTitle.objects.filter(isActive=True).annotate(employer_count=Count('employer')).order_by('employer_count')[:5]
我可能会仔细检查每个职位和他们的雇主,将他们的收入相加,然后将他们的总数相除,但这当然是一个糟糕且效率低下的解决方案。
如何在django中高效地实现这样的操作?
谢谢
JobTitle.objects.annotate(jobtitle_count=Count('jobtitle')).order_by('-jobtitle_count')[:5]
发布于 2011-06-22 18:54:42
以相同货币计算的收入总和
如果所有的收入数字都使用相同的货币,您可以使用annotate
和Avg
来完成此操作。
job_titles = JobTitle.objects.filter(isActive=True
).annotate(employer__count=Count('employer'),
average_revenue=Avg('employer__revenue'),
).order_by('employer__count')[:5]
以不同货币计算收入总和
在您提到的评论中,您希望将英镑和欧元的收入换算成美元。恐怕我没有一个优雅的解决方案。
一种方法是使用values()
获取每种货币的总和:
# look at the employers in the top job titles
employers = Employer.objects.filter(job_title=job_titles)
currency_totals = employers.values('job_title', 'currency', Count('revenue'), Sum('revenue'))
这将返回一个ValuesQuerySet
,例如
[{'job_title':1, 'currency': 'GBP', 'revenue__sum': 20.0, 'revenue__count': 1},
{'job_title':1, 'currency': 'EUR', 'revenue__sum': 35.0, 'revenue__count': 2},
{'job_title':2, 'currency': 'USD', 'revenue__sum': 50.0, 'revenue__count': 1},
...
]
然后,您可以遍历视图中的结果,将每个revenue__sum转换为USD,并将其添加到该职位的运行总数中。
这样,您只需要一次查询即可获得给定job_titles
集的收入和。但是,因为我们在视图中处理结果,所以您不能让数据库对其进行过滤,或者按收入计算进行排序,例如“显示等效收入大于1000美元的职务”。
我很有兴趣看到任何其他方法--我们有客户以英镑、欧元和美元向我们付款,因此我们需要生成类似的报告。
https://stackoverflow.com/questions/6438466
复制相似问题