2017-08-30 5 views
1

これでいいです。私はあなたがビールのユーザー、ビール、およびレビューを作成することができますこのWebアプリに取り組んでいます。異なるモデルインスタンス(Django)のユーザー入力の平均値を取得する

models.py:

from django.db import models 
from django.conf import settings 

class BeerModel(models.Model): 

    user = models.ForeignKey(User, default=1) 
    name = models.CharField(max_length=254, default="") 
    style = models.CharField(max_length=254, default="") 
    ibu = models.IntegerField(default="") 
    calories = models.IntegerField(default="") 
    abv = models.IntegerField(default="") 
    location = models.CharField(max_length=254, default="") 

    class Meta: 
     verbose_name_plural = 'Beers' 

    def __str__(self): 
     return self.name 

    def avg(self): 
     return 


class RateModel(models.Model): 

    FIVE_REVIEWS = (
     ('5', '5'), 
     ('4', '4'), 
     ('3', '3'), 
     ('2', '2'), 
     ('1', '1'), 
    ) 

    TEN_REVIEWS= (
     ('10', '10'), 
     ('9', '9'), 
     ('8', '8'), 
     ('7', '7'), 
     ('6', '6'), 
     ('5', '5'), 
     ('4', '4'), 
     ('3', '3'), 
     ('2', '2'), 
     ('1', '1'), 
    ) 

    user = models.ForeignKey(User, default=1) 
    beer = models.ForeignKey(BeerModel) 
    aroma = models.PositiveIntegerField(max_length=2, choices=FIVE_REVIEWS, default="5") 
    appearance = models.PositiveIntegerField(max_length=2, choices=FIVE_REVIEWS, default="5") 
    taste = models.PositiveIntegerField(max_length=2, choices= TEN_REVIEWS, default= "10") 

    class Meta: 
     verbose_name_plural = 'Ratings' 

    def __str__(self): 
     return str(self.beer) 

あなたが言うことができるように、あなたが別のユーザーを使用して異なるビールのレビューを作成することができます。

私の目標は、HTMLにdjangoを出力し、ビールごとに「アロマ、外観、味」の「平均」値を設定することです。

これは私が私のviews.pyに持っているものです。

@login_required 
def home(request): 
    beers = BeerModel.objects.order_by('name') 
    rates = RateModel.objects.order_by('user') 
    avg = RateModel.objects.aggregate(aroma = Avg('aroma'), appearance = Avg('appearance'), taste = Avg('taste')) 
    dict = {'records': beers, 'rates': rates, 'avg': avg} 

    return render(request, 'beer_tracker/home.html', context=dict) 

は、これは私が私のhome.htmlに持っているものです。

残念ながら
<h2>Overall Rating</h2> 
    {% for beers in records %} 
     <div class="table"> 
      <h4><b>Beer's Overall Ratings: </b>{{ beers.name}}</h4> 
      <ul> 
       <li><b>Aroma: </b>{{ avg.aroma }}</li> 
       <li><b>Appearance: </b>{{ avg.appearance }}</li> 
       <li><b>Taste: </b>{{ avg.taste }}</li> 
      </ul> 
     </div> 
    {% endfor %} 

、あなたが言うことができるように、私を得ますすべてのビールの平均。私は特定のビールごとに平均が必要です。

User1の アロマ:3、 外観:3、 味:8、

User2の私はビールを持っている場合

ので、2人のユーザーが2件のレビューを与えるのは、ブルームーンを言わせて、私が持っています アロマ:5、 外観:5、 味:10、

私はブルームーンのために取得したいと思います:

アロma:4, 外観:4, 味覚:9,

しかし、他のビールのレビュー値は依然として維持されています。

ありがとうございます。

アンソニー

+0

RateModelでメソッドを作成する必要がありますか、または私のviews.pyで関数を作成する必要がありますか? – Anthony

答えて

1

代わりの集計を使用して、あなたは平均値でクエリセットあなたのビールに注釈を付ける必要があります。

from django.db.models import Avg 

beers = BeerModel.objects.order_by('name').annotate(
    avg_aroma=Avg('ratemodel__aroma'), 
    avg_appearance=Avg('ratemodel__appearance'), 
    avg_taste=Avg('ratemodel__taste'), 
) 

次に、ビールクエリーセットをループすると、注釈付きフィールドにアクセスできます。

{% for beer in beers %} 
{{ beer.avg_aroma }} 
{{ beer.avg_appearance} } 
{{ beer.avg_taste }} 
{% endfor %} 

詳細については、joins and aggregatesのドキュメントを参照してください。

+0

ありがとうございます。これはうまくいった。私はこのことを理解するのに数日を費やした。 – Anthony

関連する問題