首页 > 解决方案 > 在 Django2 上汇总总和

问题描述

我有 2 张桌子。表 A 是

+--+------------------+ 
| ID |    Fastivalname    |
+--+------------------+ 
| 1   |    2020Xmas   |
+--+------------------+ 
| 2  |     2019Xmas    |
+--+------------------+ 
| 3 | 2020Thanksgiving |
+--+------------------+ 
| 4 | 2019Thanksgiving |
+--+—————————+ 

Fastival 是表 B 的外键,表 B 是

+--+------------------+ ------------------+------------------+
| ID |    fastival_name_id    |        money   |        useofmoney    |
+--+------------------+ ------------------+------------------+
| 1   |        1         |     100        |              game
+--+------------------+ ------------------+------------------+
| 2  |         1        |      20         |              clothes
+--+------------------+ ------------------+------------------+
| 3 |          3        |    50           |              food
+--+------------------+ ------------------+------------------+
| 4 |         4         |      10         |              game
+--+------------------+ ------------------+—————————+
| 1   |         2       |      30         |              food
+--+------------------+ ------------------+------------------+
| 2  |         3        |      15         |              game
+--+------------------+ ------------------+—————————+

和models.py是:

class TableA(models.Model):
    Fastivalname = models.CharField(max_length=50)

class TableB(models.Model):
    fastival_name = models.ForeignKey(to=TableA, related_name="TableA_Fastival_name", on_delete=models.CASCADE)
    money = models.IntegerField(default=0)
    useofmoney = models.CharField(max_length=200, null=True, blank=True) 

请有人告诉我如何在gameDjango2 中获得“2020xxx 的总金额”?

我试过了context["money"] = TableB.objects.filter(fastival_id=TableA.objects.filter(Fastivalname__startswith=2020.values('id')[0]['id']).filter(useofmoney="game").aggregate(Sum('money'))['money']。但是那个回答“无”......

标签: djangoaggregatedjango-queryset

解决方案


您可以使用单个查询来执行此操作,TableB并使用双下划线语法对相关模型/表执行连接/过滤器

TableB.objects.filter(
    fastival__Fastival__startswith='2020',
    useofmoney='game'
).aggregate(total=Sum('money'))['total']

推荐阅读