【问题标题】:Django - Make query to another table from count resultDjango - 从计数结果查询另一个表
【发布时间】: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


    【解决方案1】:

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

    这里是Django Doc

    【讨论】:

      【解决方案2】:

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

      grouped_payments_iterator = itertools.groupby(payments,dcount)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-18
        • 2011-09-16
        • 1970-01-01
        相关资源
        最近更新 更多