Djangoで作っているアプリの中で、顧客別、月次別の売上高集計表を作成しようと考えています。
表示したい画面は、下記のようなものです。
顧客と売上を扱うモデルは、下記のとおりです。(これ自体はうまく動いています。)
python
1#models.py 2 3class Customer(models.Model): #顧客を扱うmodel 4 id = models.IntegerField('顧客番号', blank = True, primary_key = True, unique = True) 5 name = models.CharField(u'顧客名称', blank = True, max_length = 100) 6 def __unicode__(self): 7 return u"%s" % self.id 8 9class Sales(models.Model): #売上を扱うmodel 10 date = models.DateField(u'売上日') 11 customer_id = models.ForeignKey(Customer) #顧客ID 12 ammount = models.IntegerField(u'金額') 13 def __unicode__(self): 14 return u"%s" % self.customer_id
views.pyをどうしたらよいか分からないのですが、現状、下記のようにしています。
python
1#views.py 2def month_total(request): 3 customer = Customer.objects.all() 4 customerlist = [] #空のリストを作成 5 for customer in customer: 6 customerlist.append(customer.id) #顧客IDのリストを作成 7 8 start_date = date(2012,10,1) #2012年10月1日からのデータを取りまとめます。 9 today = date.today() 10 end_date = date.fromtimestamp(time.mktime((today.year,today.month + 1,1,0,0,0,0,0,0))) #今日を含む月の月末までを集計の対象とします。 11 12 # 各月の初日のリストを取得するためのコード 13 months = [start_date] 14 first_date_of_each_month = start_date 15 while first_date_of_each_month < end_date: 16 first_date_of_each_month = date.fromtimestamp(time.mktime((first_date_of_each_month.year,first_date_of_each_month.month + 1,1,0,0,0,0,0,0))) 17 months.append(first_date_of_each_month) #ここまでで、 [datetime.date(2012, 10, 1), datetime.date(2012, 11, 1), ・・・,, datetime.date(2015, 10, 1)]というリストができます(これ自体はうまくいっています)。 18 19 sales_for_each_customer= [] #顧客毎の売上を入れるための空のリスト 20 21 for customer in customerlist: 22 sales = Sales.objects.filter(customer_id = customer) #各顧客への売上をピックアップ 23 sales_in_each_month = [] #各顧客の各月毎の売上を集計するための空のリスト 24 for m in months : 25 last_date_of_each_month = date.fromtimestamp(time.mktime((m.year,m.month + 1,1,0,0,0,0,0,0))) - timedelta(days=1) #各月の月末の日 26 sales_in_month = 0 #各顧客の各月売上集計 27 for s in sales : 各顧客への売上が、どの月のものかを判定するコード 28 if s.date >= first_date_of_each_month and s.date <= last_date_of_each_month : #もし、当該売上日が当月初日以上当月月末日以下であった場合 29 sales_in_month = sales_in_month + s.ammount #当該売上を当月売上高に集計 30 sales_in_each_month.append(sales_in_month) 31 first_date_of_each_month = last_date_of_each_month + timedelta(days = 1) #次の月の初日 32 sales_for_each_customer.append(sales_in_each_month) #[・・・、(顧客AのH27.1月売上)、(顧客AのH27.2月売上)、・・・]というリストができる。(これ自体はうまくいきます。) 33 first_date_of_each_month = start_date #次の顧客に移る前に、2012年10月1日に戻す。 34 35 return render_to_response('cls/sales_list.html', 36 {''months' : months, 'sales_in_each_month' : sales_in_each_month, 'customerlist' : customerlist, 'sales_for_each_customer' : sales_for_each_customer}, 37 context_instance = RequestContext(request) 38 ) 39
テンプレートは、下記のとおりです。
html
1<!--sales_list.html--> 2{% extends "base.html" %} 3{% load humanize %} 4・・・ 5{% block content %} 6<table> 7<tr> 8 <th>顧客id</th> 9 {% for months in months %} 10 <th>{{months | date:"Y-m"}}</th> 11 {% endfor %} 12</tr> 13{% for customer in customerlist %} 14<tr> 15 <td>{{customer}}</td> 16 {% for sales in sales_for_each_site %} 17 <td style = "text-align:right">{{sales | intcomma}}</td> 18 {% endfor %} 19</tr> 20{% endfor %} 21</table> 22{% endblock %}
上記の結果、sales_for_each_customerには、 [[顧客Aの2012.10月売上, 顧客Aの2012.11月売上,・・・,顧客Aの2015.9月売上],[顧客Bの2012.10月売上, 顧客Bの2012.11月売上,・・・,顧客Bの2015.9月売上],・・・]が入っていることは確認できています。
しかしながら、実際に表示されるのは、顧客Aの2012.10月のところに顧客Aの各月の売上のリストが表示され、顧客Aの2012.11月のところに顧客Bの各月の売上のリストが表示されるようなことになってしまっています。
どうしたら良いのでしょうか。
そもそも、この方法は、足りない知識を使って、何とか無理矢理作ったコードです。しかし、このような処理自体はよくありがちなものではないかと思います。一般的に、こういう時はこういう考え方でやるという定番的な方法があるのであれば、それを知りたいです。
分かりづらい内容の質問を長々と書いて申し訳ありません。
お分かりの方、ご教示頂ければ幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/09/11 13:28