該当のソースコード
models.py
~省略 from django.db.models import F, Sum class ShoppingCart(models.Model): user = models.OneToOneField( User, verbose_name = 'ユーザ', related_name = 'cart', on_delete = models.CASCADE ) @property def item_count(self): return self.cart_items.all().aggregate(amount = Sum('amount'))['amount'] @property def total_price(self): return self.cart_items.all().aggregate(total=Sum(F('product__price') * F('amount')))['total'] class ShoppingCartItem(models.Model): cart = models.ForeignKey( ShoppingCart, related_name = 'cart_items', verbose_name = 'ショッピングカート', on_delete = models.CASCADE ) product = models.ForeignKey( Product, verbose_name = '商品', on_delete = models.CASCADE ) amount = models.IntegerField( verbose_name = '数量' )
.aggregate の後の処理フローが調べてもいまいち理解できていないのでどなたかご教授お願いします。
def item_count(self): return self.cart_items.all().aggregate(amount = Sum('amount'))['amount']
1 self.cart_items.all()で、Userモデルのcart_itemsを取得。
2 .aggregate(amount = Sum('amount'))で商品の合計を集計する。
3 最後の['amount']は何をしているんでしょうか?
def total_price(self): return self.cart_items.all().aggregate(c)['total']
1 total = Sum(F('product__price')でUserが保持しているproductフィールドのpriceを合計している。
2 F('amount')))['total']何をしているのかわからない。
aggregate(total=Sum(F('product__price') * F('amount')))['total']
この場合仮に、200円の商品を2つ、500円を3つカートに入っていたとしたら、
計算があわなくなりませんか?
1900×5になってしまう気がするのですが。
補足情報(FW/ツールのバージョンなど)
python3.7.3
django 2.2
あなたの回答
tips
プレビュー