我的模型
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作为数据库。特定于db的查询也可以。
2条答案
按热度按时间gpnt7bae1#
因为这是一个更具体的问题,我添加了一个更具体的答案
如果要将serverdate作为输出,则必须应用聚合函数(max,min),因为它位于salesreport表中。
这取决于serverdate代表什么。如果它是您购买机器的日期,那么它应该在机器表中,并且可以直接从机器表中选择(where-between子句必须存在子选择并应用于机器表)。如果它是salesdate,那么它必须在salesreport中,并且必须对其应用聚合函数。ie:一周内你可能有7次约会。。。
nle07wnf2#
问题是有些日期你没有任何销售。与其说是django orm的问题,不如说是db的问题。我建议在machine表中使用带有左外联接的rawsql=>获取所有的机器并列出销售情况。
这个例子是可行的,但出于安全原因,最好通过字典传递参数
哪里