python - 从 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 的正确结果?
解决方案
您可以使用外键连接汇总模型和发票模型。如果您不导入发票 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")
推荐阅读
- r - Logit 交叉验证未运行
- vue.js - Nuxt: Inside a plugin, how to add dynamic script tag to head?
- shopify - Shopify 购物车 - 动态自定义字段片段重复
- c++ - 错误:'GenericEnclosure::GenericEnclosure' 命名构造函数,而不是类型
- git - 为什么 Git rebase 不像 Darcs 那样需要指数级的时间?
- typescript - 如何禁用生成“exports.__esModule = true;” 和“要求(“lib”);”
- sql - 选择仅在其中 3 个中具有不同的多个列
- python - 如果一个项目存在于一个列表中,而不是另一个列表中,则产生一些输出
- python - Python:基本项目结构和导入路径
- javascript - IOS 应用环境中是否有与 JavaScript 窗口对象等价的对象?