2017-02-13 4 views
0

私はこれを私の他のQuestionにここで言及したいので、月額を表示して12ヶ月のテーブルを作成しようとしています。成功した私は、テーブルに自分のデータを表示し、それだけのために全体の行を作るが、私は毎月この注釈を付けたいあなたは私の前の質問から見ることができるようにすることができますDjango annotate price per month

context["price_aux"] = Project.objects.annotate().aggregate(Sum("price_aux"))

を使用して、私の価格を計算していますし、テーブルを作ってから月の合計を表示するのですが、データベースからこれをどのように取り出すことができるのかを理解するのは本当に苦労します。django==1.8+でこれを行う正しい方法は何ですか?最近のバージョンではExtractが追加されましたが、私は1.8で使用できません.2番目のものはdjango extraです。Use this method as a last resortと書いてありますので、どうすればこの作業をすることができますか?

+0

を経由して、月ごとの価格を取得することができます。その後、月ごとに価格を選択することができます。 –

+0

私はそのようなものを使用していますが、dbから蛾を抜き取るのは苦労しますが、小さな例ができますか? – PetarP

+0

あなたのモデルが 'Prices'と呼ばれ、' month'と 'price'の2つのフィールドを持っていると仮定すると、' ppm = Prices.objects.filter(month = 1)[0] 'を実行します。 'ppm.price'はあなたに実際の価格を与えます。 –

答えて

1

__month.values_listに使用できないため、モデルにフィールドを追加することをお勧めします。 Values_listは、アノテーションの前にクエリをグループ化するために使用できます。

フィールドは次のようなものです。

year_month = models.CharField(index=True) 

あなたがモデルのsaveメソッドを上書きし、あなたの価格に注釈を付けるために今

def save(self, *args, **kwargs) 
    # Not sure if auto_add_now already set the value, could use timezone.now() 
    if not self.id: # thus not saved yet 
     self.year_month = self.created_at.strftime("%Y%m") 
    super(Model, self).save(*args, **kwargs) 

その可能性のようなものを行うことができます。

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) 

さらに詳しい情報が必要な場合は、values_listを拡張することができます。

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) \ 
    .values_list('name', 'year_month', 'price_sum') 

フィールドを追加せずに行うことは可能です。過去1年がほしいと言いましょう。

import datetime 
from django.utils import timezone 

def my_list_view(request): 
    end = timezone.now() 
    # note, could do some weird stuff in years with 366 days 
    begin = (end - datetime.timedelta(days=365)).replace(day=1) 

    container = {} 
    while begin < end: 
     container[begin.strftime("%Y%m")] = 0 
     begin = (begin + datetime.timedelta(weeks=5).replace(day=1) 

    for project in Project.objects.iterator(): 
     container[project.created_at.strftime("%Y%m")] += price 

    # Now you can render your template 
+0

これは、私の 'ListView'でiterator()を使用し、' models.py'で新しいフィールドを追加しないで* hand *で計算する価値がありますか?月に価格を計算するこのより多くのPythonの方法について疑問に思っていた – PetarP

+0

私はこのテンプレート用の汎用リストビューを使用しているので、おそらく 'mixin'を作成してこの計算を行うことができます – PetarP

+0

決して' ListView' Djangoのmixinについて聞いたことがありますが、私の答えはあなたを助けてくれてうれしいです。 – Blackeagle52

0

は、あなたのモデルがPricesと呼ばれ、dateは、日時フィールドで二つのフィールドdatepriceを持っていると言います。次に、メソッドを照会するキーワード引数としてdate__month(二重のアンダースコアに注意)を使用できます(field lookupsのドキュメントを参照)。

あなたは

次の2つの列、月の1と価格のための1つを持つテーブルを使用していないのはなぜ
Prices.objects.get(date__month=1).price