这是一个关于进行两步查询的最有效方法的问题,其中第一个查询的输出是第二个查询的输入......
我有这个模型。
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列求和,并总结' hours'可以在新列上的 ServiceRequest 表中找到的字段。
我想过循环遍历结果集的每一行,查询每个 service_request_pk ,但这样效率会非常低。 有什么想法吗?
答案 0 :(得分:0)
您需要的是两个模型之间的连接。
以下是Django Doc
答案 1 :(得分:0)
我猜你可以使用你的结果查询集并应用groupby将按预期给你结果。
grouped_payments_iterator = itertools.groupby(payment,dcount)
由于付款已经按照dcount排序,因此groupby应该可以正常工作。