前提
現在、djangoで家計簿アプリを作成していて、各年の月別の購入金額を集計する機能を作ろうとしています。
models.pyは以下のような感じです。
python
1# models.py 2 3from django.db import models 4from django.utils import timezone 5 6class User(models.Model): 7 username = models.CharField(max_length=255) 8 9 def __str__(self): 10 return self.username 11 12class Category(models.Model): 13 category_name = models.CharField(max_length=255) 14 15 def __str__(self): 16 return self.category_name 17 18class Purchase(models.Model): 19 user = models.ForeignKey(User, on_delete=models.CASCADE) 20 purchase_name = models.CharField(max_length=255) 21 purchase_date = models.DateField('date purchased', default=timezone.now) 22 price = models.IntegerField() 23 category = models.ForeignKey(Category, on_delete=models.DO_NOTHING) 24 25 def __str__(self): 26 return self.purchase_name 27
入っているデータ
>>> from .models import Purchase >>> purchase = Purchase.objects.order_by('-purchase_date') >>> purchase <QuerySet [ <Purchase: Tanaka Taro, 牛角, 500, 2020-06-02, 食費>, <Purchase: Tanaka Taro, サイゼリヤ, 1500, 2020-06-01, 食費>, <Purchase: 田中 二郎, 大戸屋, 2300, 2020-06-01, 食費>, <Purchase: 田中 三郎, 吉野家, 500, 2019-06-01, 食費> ]>
問題箇所
上記コードを使って、以下のようにannotateをしようして集計しようとすると、
2020-06-02
と2020-06-01
で分けられてしまいます。
>>> from django.db.models import Sum >>> from django.db.models.functions import TruncMonth >>> a = purchase.filter(purchase_date__year=datetime.date.today().year) >>> a <QuerySet [ <Purchase: Tanaka Taro, 牛角, 500, 2020-06-02, 食費>, <Purchase: Tanaka Taro, サイゼリヤ, 1500, 2020-06-01, 食費>, <Purchase: 田中 二郎, 大戸屋, 2300, 2020-06-01, 食費> ]> ##### 問題箇所 ##### >>> a.annotate(month=TruncMonth('purchase_date')).values('month').annotate(month_price=Sum('price')) <QuerySet [ {'month': datetime.date(2020, 6, 1), 'month_price': 500}, {'month': datetime.date(2020, 6, 1), 'month_price': 3800} ]> ##### annotateで全て6月1日は変換できている ##### >>> a.annotate(month=TruncMonth('purchase_date')).values('month') <QuerySet [ {'month': datetime.date(2020, 6, 1)}, {'month': datetime.date(2020, 6, 1)}, {'month': datetime.date(2020, 6, 1)} ]>
なぜこうなるのか原因が分からずにいます。
また、どうすれば月ごとの集計ができるのかわかる方いたら是非教えてください。
よろしくお願いします。
あなたの回答
tips
プレビュー