首页 > 解决方案 > 从 Django 中的另一个表计算总和

问题描述

我需要在 Django 中为以下内容创建模型:

Invoice table -> invoice_id, order_id, unit_price, num_units
                  1, 1, 10, 5
                  1, 2, 10, 5
                  2, 1, 10, 5
                  2, 2, 10, 5
                  3, 3, 10, 5
                  3, 1, 10, 5
                  3, 2, 10, 5

Invoice Summary table -> invoice_id, sum
                          1, 100
                          2, 100
                          3, 150 

对于 Django 中的上述表格,我的模型应该如何?

我试过了:

class Invoice(models.Model):
      inv_id = models.IntegerField()
      order_id = models.IntegerField()
      unit_price = models.IntegerField()
      num_units = models.IntegerField()

class Summary(models.Model):
      invoice_id = 
      sum = invoice_id total sum i.e ( unit_price * num_units ) for invoice_id

我的摘要模型将如何显示以使我获得特定发票 ID 的正确结果?

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


您可以使用外键连接汇总模型和发票模型。如果您不导入发票 id,则不需要 inv_id,因为 django 会自动生成 id 字段。

class Summary(models.Model):
    invoice = models.Foreignkey(Invoice,on_delete=models.CASCADE) #Cascade means if your invoice is deleted, related summaries deleted, too.
    sum = models.IntegerField()

您可以使用信号来计算总和字段。但不要忘记,更新方法不会触发信号。基本上,您可以创建一个寺庙字段作为包含 num_units 和 unit_price 相乘的结果,之后您可以使用聚合方法对该寺庙字段求和。您可以将当前字段值与F表达式一起使用。

在你的signals.py中:

def calculate_sum_of_invoice(sender, **kwargs):
    invoice_id = kwargs.get('instance').id
    summary = Invoice.objects.filter(id=invoice_id).annotate(
result=F('unit_price') * F('num_units')).aggregate(Sum('result'))['result__sum'])
    Summary.objects.update_or_create(
    invoice_id=invoice_id, defaults={"sum": summary}


post_save.connect(calculate_sum_of_invoice, sender=Invoice, dispatch_uid="invoice-save-signal")

推荐阅读