Python Django annotate+SUM如何获取所有条目

Python Django annotate+SUM如何获取所有条目,python,sql,django,django-models,django-database-functions,Python,Sql,Django,Django Models,Django Database Functions,我的模型 class Machine(models.Model): machineName = models.CharField(verbose_name="Machine Name", max_length=20, blank=False, null=False) class SalesReport(models.Model): machine = models.ForeignKey(Machine, on_delete=models.CASCADE,

我的模型

class Machine(models.Model):
    machineName = models.CharField(verbose_name="Machine Name", max_length=20, blank=False, null=False)


class SalesReport(models.Model):
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE, null=False, blank=False)
    deviceDate = models.CharField(max_length=200, null=True, blank=True)
    serverDate = models.DateTimeField(auto_now_add=True)
    totalPrice = models.FloatField()
我有3台机器,我想得到过去7天每台机器的总销售额

我的问题是

from django.db.models import Sum, Value as V
from django.db.models.functions import Coalesce

SalesReport.objects.values("serverDate__date", "machine__machineName").annotate(
...                 sales=Coalesce(Sum("totalPrice"),V(0))).filter(
...                                                 serverDate__gte=week_start,
...                                                 serverDate__lte=week_end)
它给出了以下结果

[{'serverDate__date': datetime.date(2020, 7, 22), 'machine__machineName': 'machine__1', 'sales': 15.0},
 {'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__1', 'sales': 145.0},
 {'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__2', 'sales': 270.0},
 {'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__3', 'sales': 255.0}]
我想得到的是

[{'serverDate__date': datetime.date(2020, 7, 22), 'machine__machineName': 'machine__1', 'sales': 15.0},
{'serverDate__date': datetime.date(2020, 7, 22), 'machine__machineName': 'machine__2', 'sales': 0.0},
{'serverDate__date': datetime.date(2020, 7, 22), 'machine__machineName': 'machine__3', 'sales': 0.0},
{'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__1', 'sales': 145.0},
{'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__2', 'sales': 270.0},
{'serverDate__date': datetime.date(2020, 7, 28), 'machine__machineName': 'machine__3', 'sales': 255.0}]
我试图用Coalesce来做,但我弄错了


*我使用mysql作为数据库。特定于数据库的查询也很好。

问题是某些日期没有任何销售。与其说是django ORM问题,还不如说是DB问题。我建议在您的机器表上使用左外部联接=>获取所有机器,并在出现时列出销售额

machine=machine.objects.raw' 从app_machinelist中选择machine.id、machine.name、sales.sid作为机器 左连接选择销售标识作为sid 来自app_销售部 其中profile_id={0}sales ON sales.sid=machine.id 按机器订购。名称ASC '.formatmyuser.id 此示例可以工作,但出于安全原因,最好通过字典传递参数

machine=machine.objects.rawmysql,参数 在哪里

参数={'profile_id':pk'startdate':startdate'enddate':enddate} mysql= 从app_machinelist中选择machine.id、machine.name、sales.sid作为机器 左连接选择销售标识作为sid 来自app_销售部 其中profile\u id=%profile\u id sales ON sales.sid=machine.id 按机器订购。名称ASC '
问题是有些日期你没有任何销售。与其说是django ORM问题,还不如说是DB问题。我建议在您的机器表上使用左外部联接=>获取所有机器,并在出现时列出销售额

machine=machine.objects.raw' 从app_machinelist中选择machine.id、machine.name、sales.sid作为机器 左连接选择销售标识作为sid 来自app_销售部 其中profile_id={0}sales ON sales.sid=machine.id 按机器订购。名称ASC '.formatmyuser.id 此示例可以工作,但出于安全原因,最好通过字典传递参数

machine=machine.objects.rawmysql,参数 在哪里

参数={'profile_id':pk'startdate':startdate'enddate':enddate} mysql= 从app_machinelist中选择machine.id、machine.name、sales.sid作为机器 左连接选择销售标识作为sid 来自app_销售部 其中profile\u id=%profile\u id sales ON sales.sid=machine.id 按机器订购。名称ASC '
因为这是一个更为SQL的问题,所以我添加了一个更为具体的答案

选择m.machineName,s.price 从机器m左外连接 选择机器id,sumtotalPrice 来自salesreport 其中,serverDate介于日期、间隔1周和curdate之间 按m.id=s.id上的机器id s分组 如果希望serverDate作为输出,则必须应用聚合函数Max,Min,因为它位于SalesReport表中

这取决于serverDate代表什么。如果它是您购买机器的日期,那么它应该在机器表中,可以直接从机器表中选择,并且WHERE BEVER子句必须存在子select并应用于机器表。如果它是salesDate,那么它必须在SalesReport中,并且您必须对其应用聚合函数。ie:一周内你可能有7次约会

选择m.machineName、s.MaxserverDate、s.price 从机器m左外连接 选择机器id、maxserverDate、maxserverDate、sumtotalPrice 来自salesreport 其中,serverDate介于日期、间隔1周和curdate之间 按m.id=s.id上的机器id s分组
因为这是一个更为SQL的问题,所以我添加了一个更为具体的答案

选择m.machineName,s.price 从机器m左外连接 选择机器id,sumtotalPrice 来自salesreport 其中,serverDate介于日期、间隔1周和curdate之间 按m.id=s.id上的机器id s分组 如果希望serverDate作为输出,则必须应用聚合函数Max,Min,因为它位于SalesReport表中

这取决于serverDate代表什么。如果它是您购买机器的日期,那么它应该在机器表中,可以直接从机器表中选择,并且WHERE BEVER子句必须存在子select并应用于机器表。如果它是salesDate,那么它必须在SalesReport中,并且您必须对其应用聚合函数。ie:一周内你可能有7次约会

选择m.machineName、s.MaxserverDate、s.price 从机器m左外连接 选择机器id、maxserverDate、maxserverDate、sumtotalPrice 来自salesreport 其中,serverDate介于日期、间隔1周和curdate之间 按m.id=s.id上的机器id s分组
此外,为了得到您的最后7天,您可以在今天和serverDate之间执行日期差异,并在差异大于8时保留记录。我需要的是每台机器的总销售额之和
对给定日期的默认值。我在这里已经完成了。但是,如果一台机器没有销售,它也应该显示为销售为0。此外,要获得您的最后7天,您可以在今天和serverDate之间执行一个日期差,并在该差大于8时保留记录。我需要的是给定日期内每台机器发生的总销售额的总和。我在这里已经完成了。但是,如果机器中没有销售,也应该显示销售为0。