2016-05-29 20 views
0

私は表に提示した資産の総重量を表示しようとしています。Django積算値の合計

各アセットは、重量および量を有し、私は以下のように各資産の総重量を提示することができる:

def by_item_weight(self): 
    """This Method gives the total value of the asset. Weight * Qnty""" 
    total = self.asset_quantity * self.asset_weight 
    return total 

私は何をしたいことの(各資産の合計項目重量を取る結果でありますqnty * weight)を計算し、すべてのアセットの全重量を表示します。

私はby_item_weight「列」の合計を返すために以下の様々な組み合わせを作るしようとしている:

Asset.objects.all().annotate(total=Sum('by_item_weight') 

しかし、私はバイ・アイテム・重量はで定義されていないとして、これは動作しません理解モデル資産。

私はassetslist.htmlテンプレートに以下のようにforループを経由して表を提示しています:

{% block content %} 



<table class="well table table-striped text-center"> 
    <thead> 
     <tr class="text-center"> 
      <th class="text-center">Asset ID:</th> 
      <th class="text-center">Asset Name:</th> 
      <th class="text-center">Asset Quantity:</th> 
      <th class="text-center">Asset Weight/kg:</th> 
      <th class="text-center">Total Weight/kg:</th> 
      <th class="text-center">Asset Owner:</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr class="text-center"> 
{% for asset in object_list %} 
      <td>{{ asset.id }}</td> 
      <td>{{ asset.asset_name }}</td> 
      <td>{{ asset.asset_quantity }}</td> 
      <td>{{ asset.asset_weight }}</td> 
      <td>{{ asset.by_item_weight }}</td> 
      <td>{{ asset.asset_owner }}</td> 


     </tr> 


{% endfor %} 

私は、Pythonに新しいですし、各asset.by_item_weightの値をキャプチャする方法を見つける問題を抱えていますリストに入れてもらえればリストを合計して結果を表示することができます。

マイモデル

class Asset(models.Model): 
    asset_name = models.CharField(max_length=30) 
    asset_quantity = models.IntegerField(default=0) 
    asset_weight = models.IntegerField(default=0) 
    asset_owner = models.ForeignKey(
     'AssetOwner', 
     on_delete=models.CASCADE, 
    ) # This should be a Foreign Key Drop down of AssetOwners owner_name. 


    def by_item_weight(self): 
     """This Method gives the total value of the asset. Weight * Qnty""" 
     total = self.asset_quantity * self.asset_weight 
     return total 

    def __str__(self): 
     return '{}'.format(self.asset_name) 
     return 'Asset Quantity: {}'.format(self.asset_quantity) 
     return 'Asset Weight: {}'.format(self.asset_weight) 
     return 'Asset Owner: {}'.format(self.asset_owner) 
     return 'Asset Owner: {}'.format(self.asset_owner) 

は、任意の助けもいただければ幸いです。

更新日:

今エラーなし、しかし表示/ sum_total

新規テンプレート

{% extends "personal/header.html" %} 

{% block content %} 

<h1 class='text-center'>This is the full asset list not split by owner</h1></br> 

    <table class="well table table-striped text-center"> 
     <thead> 
      <tr class="text-center"> 
       <th class="text-center">Asset ID:</th> 
       <th class="text-center">Asset Name:</th> 
       <th class="text-center">Asset Quantity:</th> 
       <th class="text-center">Asset Weight/kg:</th> 
       <th class="text-center">Total Weight/kg:</th> 
       <th class="text-center">Asset Owner:</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr class="text-center"> 
    {% for asset in object_list %} 
       <td>{{ asset.id }}</td> 
       <td>{{ asset.asset_name }}</td> 
       <td>{{ asset.asset_quantity }}</td> 
       <td>{{ asset.asset_weight }}</td> 
       <td>{{ asset.by_item_weight }}</td> 
       <td>{{ asset.asset_owner }}</td> 


      </tr> 


    {% endfor %} 

     </tbody> 
    </table> 


<p class="" style="">Total Weight In Stock : {{ asset.sum_total }}</p> 


<p class="text-center">{% include "sam/includes/backtosam.html" %}</p> 



{% endblock %} 

新モデル

from __future__ import unicode_literals 
    from django.db import models 
    from django.db.models import Sum, F, Count 
    from django.db.models import Max 
    from django.db.models import ExpressionWrapper 
    from django.db.models import Aggregate 

    class Asset(models.Model): 
     asset_name = models.CharField(max_length=30) 
     asset_quantity = models.IntegerField(default=0) 
     asset_weight = models.IntegerField(default=0) 
     asset_owner = models.ForeignKey(
      'AssetOwner', 
      on_delete=models.CASCADE, 
     ) # This should be a Foreign Key Drop down of AssetOwners owner_name. 
    def by_item_weight(self): 
     """This Method gives the total value of the asset. Weight * Qnty""" 
     total = self.asset_quantity * self.asset_weight 
     return total 

    def sum_total(self): 
     assets = Asset.objects.all().annotate(
     total_weight=ExpressionWrapper(F('asset_quantity') *  F('asset_weight'),output_field=IntegerField)) 
     the_sum = assets.aggregate(total=Sum('total_weight')) 
     return the_sum 

    def __str__(self): 
     return '{}'.format(self.asset_name) 
     return 'Asset Quantity: {}'.format(self.asset_quantity) 
     return 'Asset Weight: {}'.format(self.asset_weight) 
     return 'Asset Owner: {}'.format(self.asset_owner) 
     return 'Asset Owner: {}'.format(self.asset_owner) 
     return 'Total Weight of Assets: {}'.format(self.assets) 

更新されたビューの値を示すことはまだできませんが

from django.shortcuts import render 
from django.http import HttpResponse 
from django.core.cache import cache 
from django.db.models import Sum, F 

def get_total_weight(self): 

    total_weight = cache.get('total_weight',-1) 
    if total_weight == -1: 
     total_weight = Asset.objects.annotate(total_weight=F('asset_quantity')*F('asset_weight')).aggregate(total=Sum('total_weight')) 
     # this is tested 
     cache.set('total_weight',total_weight) 
     return total_weight 

def index(request): 

    return render(request, 'sam/index.html') 

def assetslist(request): 

    return render(request,'sam/assetslist.html',{'total_weight': get_total_weight}, assets = Asset.objects.all()) 

明らかに私が電話していない上記のassetslistメソッドに問題があると思われます。任意の入力/提案のため

テンプレート

{% extends "personal/header.html" %} 

{% block content %} 

<h1 class='text-center'>This is the full asset list not split by owner</h1></br> 

    <table class="well table table-striped text-center"> 
     <thead> 
      <tr class="text-center"> 
       <th class="text-center">Asset ID:</th> 
       <th class="text-center">Asset Name:</th> 
       <th class="text-center">Asset Quantity:</th> 
       <th class="text-center">Asset Weight/kg:</th> 
       <th class="text-center">Total Weight/kg:</th> 
       <th class="text-center">Asset Owner:</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr class="text-center"> 
    {% for asset in object_list %} 
       <td>{{ asset.id }}</td> 
       <td>{{ asset.asset_name }}</td> 
       <td>{{ asset.asset_quantity }}</td> 
       <td>{{ asset.asset_weight }}</td> 
       <td>{{ asset.by_item_weight }}</td> 
       <td>{{ asset.asset_owner }}</td> 



      </tr> 


    {% endfor %} 

     </tbody> 
    </table> 
<p class="" style="">Total Weight In Stock : {{ get_total_weight }}</p> 
<p class="" style="">Total Weight In Stock : {{ assetslist }}</p> 



    <!-- <table class="well table table-striped text-center"> 
     <thead> 
      <tr class="text-center"> 

       <th class="text-center"></th> 
       <th class="text-center"></th> 
       <th class="text-center"></th> 
       <th class="text-center"></th> 
       <th class="text-center">Total Weight/kg:</th> 

      </tr> 
     </thead> 
     <tbody> 
      <tr class="text-center"> 
    {% for sum_weight in object_list %} 

       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td>{{ asset.sum_total }}</td> 

      </tr> 


    {% endfor %} 
     </tbody> 
    </table> --> 






<p class="text-center">{% include "sam/includes/backtosam.html" %}</p> 



{% endblock %} 

感謝。

さらにUPDATE:

私は以下にビューを調整しています

from django.core.cache import cache 
from django.db.models import Sum, F 


def get_total_weight(self): 
    total_weight = cache.get('total_weight',-1) 
    if total_weight == -1: 
     total_weight = Asset.objects.annotate(total_weight=F('asset_quantity')*F('asset_weight')).aggregate(total=Sum('total_weight')) 
     # this is tested 
     cache.set('total_weight',total_weight) 

    return total_weight 

    render(request,'template_name',{'total_weight': get_total_weight, assets = Asset.objects.all() }) 

私はassets = Asset.objects.all() }) =記号のエラーを取得しています。 SyntaxError:無効な構文

私は、レンダリングがそれ自身の機能にある必要があると思いますか?

UPDATE:

私は私の意見を更新し、モデルからDEFを移動しています。PY

私のviews.pyファイルには、私はどちらか動作しませんでした。この問題を解決するために実装しようとしたその下のJSがあり

assetlist.html

def total_weight(request): 

    assets = Asset.objects.all().annotate(
    total_weight=ExpressionWrapper(F('asset_quantity') * F('asset_weight'), 
            output_field=IntegerField())) 

    return render(request, 'sam/index.html') 


def sum_total(request): 

    the_total = assets.aggregate(total=Sum('total_weight')) 

    return render(request, 'sam/assetlist.html') 

def index(request): 

    return render(request, 'sam/index.html') 

def by_item_weight(self): 
     """This Method gives the total value of the asset. Weight * Qnty""" 
     total = self.asset_quantity * self.asset_weight 
     return total 

    def get_total_weight(self): 
     total_weight = Asset.objects.filter(by_item_weight__isnull=True).aggregate(Sum('by_item_weight')) 
     Asset.objects.annotate(total_weight=F('asset_quantity')*F('asset_weight')).aggregate(total=Sum('total_weight')) 


    def __str__(self): 
     return '{}'.format(self.asset_name) 
     return '{}'.format(self.total_weight) 

以下の通りです。

私はassetlist.htmlでdef.pyの値を呼び出す際に何か不足しているように感じます。

{% extends "personal/header.html" %} 


{% block content %} 

<h1 class='text-center'>This is the full asset list not split by owner</h1></br> 




    <table id="sum_table" class="well table table-striped text-center"> 
     <thead> 
      <tr class="text-center titlerow"> 
       <td class="text-center">Asset ID:</td> 
       <td class="text-center">Asset Name:</td> 
       <td class="text-center">Asset Quantity:</td> 
       <td class="text-center">Asset Weight/kg:</td> 
       <td class="text-center">Total Weight/kg:</td> 
       <td class="text-center">Asset Owner:</td> 
      </tr> 
     </thead> 
     <tbody> 
      <tr class="text-center"> 

    {% for asset in object_list %} 
       <td><a href="/sam/assets/{{ asset.id }}">{{ asset.id }}</></td> 
       <td>{{ asset.asset_name }}</td> 
       <td>{{ asset.asset_quantity }}</td> 
       <td>{{ asset.asset_weight }}</td> 
       <td class="rowDataSd">{{ asset.by_item_weight }}</td> 
       <td><a href="/sam/owners/">{{ asset.asset_owner }}</></td> 

      </tr> 

    {% endfor %} 



      <tr class="totalColumn"> 
       <td class=""></td> 
       <td class=""></td> 
       <td class=""></td> 
       <td class=""></td> 
       <td class="totalCol">Total: {{ asset.get_total_weight }}</td> 
       <td class=""></td> 
      </tr> 
     </tbody> 
    </table> 

<p>Hope this is full ({{ this_view }} )?</p> 

<p class="text-center">{% include "sam/includes/backtosam.html" %}</p> 

<!-- 
<script> 
     var total = 0; 
$('#sum_table tr td.rowDataSd').each(function() { 
    total += parseInt($(this).text()); 
}); 
$('#sum_table td.totalCol').text("total: " + total); 
</script> 
--> 

{% endblock %} 

UPDATE - 2016年7月3日

from __future__ import unicode_literals 
from django.db import models 
from django.db.models import Sum, F, Count 
from django.db.models import Max 
from django.db.models import ExpressionWrapper 
from django.db.models import Aggregate 

from django.contrib.auth.models import User 

class Asset(models.Model): 
    asset_name = models.CharField(max_length=30) 
    asset_quantity = models.IntegerField(default=0) 
    asset_weight = models.IntegerField(default=0) 
    total_assets_weight = models.IntegerField(default=0) 
    asset_owner = models.ForeignKey(
     'AssetOwner', 
     on_delete=models.CASCADE, 
    ) # This should be a Foreign Key Drop down of AssetOwners owner_name. 

    def by_item_weight(self): 
     """This Method gives the total value of the asset. Weight * Qnty""" 
     total = self.asset_quantity * self.asset_weight 
     return total 

    def total_weight(self): 

     assets = Asset.objects.all().annotate(
     total_weight=ExpressionWrapper(F('asset_quantity') * F('asset_weight'), 
             output_field=IntegerField())) 

     the_total = assets.aggregate(total=Sum('total_weight')) 

     return the_total 

テンプレート

{% extends "personal/header.html" %} 


{% block content %} 

<h1 class='text-center'>This is the full asset list not split by owner</h1></br> 




    <table id="sum_table" class="well table table-striped text-center"> 
     <thead> 
      <tr class="text-center titlerow"> 
       <td class="text-center">Asset ID:</td> 
       <td class="text-center">Asset Name:</td> 
       <td class="text-center">Asset Quantity:</td> 
       <td class="text-center">Asset Weight/kg:</td> 
       <td class="text-center">Total Weight/kg:</td> 
       <td class="text-center">Asset Owner:</td> 
      </tr> 
     </thead> 
     <tbody> 
      <tr class="text-center"> 

    {% for asset in object_list %} 
       <td><a href="/sam/assets/{{ asset.id }}">{{ asset.id }}</td> 
       <td>{{ asset.asset_name }}</td> 
       <td>{{ asset.asset_quantity }}</td> 
       <td>{{ asset.asset_weight }}</td> 
       <td class="rowDataSd">{{ asset.by_item_weight}}</td> 
       <td><a href="/sam/owners/">{{ asset.asset_owner }}</td> 



      </tr> 

    {% endfor %} 

    {% for total in object_list %} 

      <tr class="totalColumn"> 
       <td class=""></td> 
       <td class=""></td> 
       <td class=""></td> 
       <td class=""></td> 
       <td class="totalCol">Total: {{ total.total_weight }}</td> 
       <td class=""></td> 
      </tr> 
     </tbody> 
    </table> 
    {% endfor %} 


<p class="text-center">{% include "sam/includes/backtosam.html" %}</p> 



{% endblock %} 

答えて

2

あなたはExpressionWrapper()(主にジャンゴを1.8+)を使用することができ

assets = Asset.objects.all().annotate(
    total_weight=ExpressionWrapper(F('asset_quantity') * F('asset_weight'), 
            output_field=IntegerField())) 

これは、各オブジェクトの総重量、つまり数量倍の重量を与えるはずです。

ここで、total_weightのすべてから合計を得ることができるはずです。

編集:今、あなたは上記の合計

assets.aggregate(total=Sum('total_weight')) 

{'total': 1234.5678} 
+0

感謝を取得するためにAggregateを使用することができます。これを私のモデルに組み込んだのですが、テンプレート/テーブルページを表示しても結果が表示されません。 ''

{{asset.sum_total}}

''私のメソッドの名前がsum_totalであると仮定して結果を返すべきですか?モデルのコードは '' def sum_total(self): assets = Asset.objects.all()。annotate( total_weight = ExpressionWrapper(F( 'asset_quantity')* F( 'asset_weight')、output_field = IntegerField) return assets' –

+0

私の答えに追加しました – C14L

+0

ありがとう@ C14L私は上記のモデルとテンプレートを更新しましたが、エラーメッセージは表示されませんが、新しいsum_totalsメソッドの値は表示されません。 '{{asset.sum_total}}'テンプレート上に –