Django - 从计数结果查询另一个表

时间:2017-03-21 00:24:09

标签: django postgresql django-models

这是一个关于进行两步查询的最有效方法的问题,其中第一个查询的输出是第二个查询的输入......

我有这个模型。

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 ,但这样效率会非常低。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您需要的是两个模型之间的连接。

以下是Django Doc

答案 1 :(得分:0)

我猜你可以使用你的结果查询集并应用groupby将按预期给你结果。

grouped_pa​​yments_iterator = itertools.groupby(payment,dcount)

由于付款已经按照dcount排序,因此groupby应该可以正常工作。