【发布时间】:2017-03-21 00:24:08
【问题描述】:
这是一个关于进行两步查询的最有效方法的问题,其中第一个查询的输出是第二个查询的输入...
我有这个模型。
class Payment(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
service_request = models.ForeignKey(ServiceRequest, null=True)
split_request = models.ForeignKey(SplitRequest, null=True)
amount = models.FloatField()
user = models.ForeignKey(User, null=True)
lesson_fee = models.ForeignKey(LessonFee, null=True)
stripe_token = models.CharField(max_length=150, null=True)
class ServiceRequest(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
start_at = models.DateTimeField(blank=True)
....
hours = models.SmallIntegerField(blank=True, null=True)
目前,我在 views.py 中有以下查询集:
payments = Payment.objects.values('service_request').annotate(dsum=Sum('amount')).annotate(dcount=Count('service_request')).order_by('dcount')
这给出了类似以下的结果:
service_request dcount dsum
...
177 1 31.2
202 1 31.2
205 1 31.2
197 1 31.2
187 1 62.1
174 2 6.24
155 3 74.52
209 4 46.4
如您所见,我得到 5 行,计数值为 1。我想对这个结果集进行一些聚合,比如对重复 dcount 行的 dsum 列求和,并将 ServiceRequest 表上的新列上的“小时”字段求和。 p>
我想过循环遍历结果集的每一行,查询每个service_request_pk,但这会非常低效。 有什么想法吗?
【问题讨论】:
标签: django postgresql django-models