質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

11220閲覧

【Django】views.pyにおいて、filterで絞り込んだクエリセットの合計値を算出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

1クリップ

投稿2015/06/27 12:59

編集2015/06/27 13:10

Djangoで工事台帳を作成しており、
工事ごとの請負金額を取りまとめる表を作成したいと考えています。

例えば、下記のように、当初、追加1、追加2を入力すると(Adminsiteで入力し、これはできています。)、計を計算して表示されるようにしたいです。
当初 10,000,000円
追加1 2,000,000円
追加2 1,000,000円
計 13,000,000円

model.pyは、下記の通りで問題ないと思います。

lang

1#models.py 2# -*- coding: utf-8 -*- 3from django.db import models 4class ContractPrice(models.Model): 5 site_id = models.ForeignKey(Site) 6 price = models.IntegerField(u'税込金額')

views.pyがうまくいっていないと思います。

lang

1#views.py 2# -*- coding: utf-8 -*- 3from django.shortcuts import render_to_response, get_object_or_404 4from django.http import HttpResponse 5from django.template import RequestContext 6from cls.models import ContractPrice, Owner, Site 7 8def site_detail(request, id): 9 if id: 10 site = get_object_or_404(Site, pk = id) 11 else: 12 id = Site() 13 site = Site.objects.filter(id = id) 14 prices = ContractPrice.objects.filter(site_id = id) 15 totalsales = sum(prices.price) 16 return render_to_response('cls/site_detail.html', 17 {'site' : site, 'contractprice' : price, 'totalsales' : totalsales}, 18 context_instance = RequestContext(request) 19 )

上記のように、
totalsales という変数に、請負金額の合計を代入するために、
totalsales = sum(prices.price)
としました。
pricesは、idで絞り込んだ要素を意味するので、そのpriceアトリビュートを合計すればよいと思ったためです。
しかし、
「AttributeError
'QuerySet' object has no attribute 'price'」
というエラーが出ます。
sumの使い方が誤っているのかと思い、外してみましたが、結果は同じでした。

ちなみに、annotateを使えば解決するのかと思い、
totalsales = prices.annotate(Sum('price'))
としてみましたが、
「NameError
global name 'Sum' is not defined」
というエラーが出ました。

私の考え方のどこかが誤っているのだと思いますが、お分かりの方、ご教示いただけないでしょうか。
お手数をお掛けしますが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

先ほどURLについて回答させていただいた者です。
また回答させていただきたいと思います。

今回のエラーは「QuerySetにはpriceという属性はありません」という事だと思います。
この「QuerySet」は簡単いうと「1つ1つのモデルインスタンス(データベースでいうレコードだと思ってください)をリストに格納したもの」だと思ってください。
「prices = ContractPrice.objects.filter(site_id = id)」という箇所で使用している「filter」メソッドがQuerySetを返すメソッドになります。

よって、そのまま変数pricesに「.price」と指定しても、リストに属性を指定しているようなものなので上記のエラーが発生したと思います。

修正箇所は以下のようになると思います。

lang

1totalsales = sum([p.price for p in prices])

for文を使用し、1つ1つモデルのインスタンスを取り出し、その属性であるpriceを格納したリストを元にsum関数で合計を出すようにすると大丈夫だと思います。

今回は少々説明が難しくになってしまい、わかりづらいかと思いますが、もし解決できなかった場合はまたコメントいただければと思います。

よろしくお願いいたします。

投稿2015/06/27 14:34

編集2015/06/27 14:37
takaocs

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/06/28 10:27

ありがとうございました。 ご指摘頂いたとおりでうまくいきました。 丁寧にご説明いただき助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問