2017-02-02 1 views
0
models.py 
class Contest(models.Model): 
    sport = models.CharField(max_length=200) 

class Player(models.Model): 
    name = models.CharField(max_length=200) 
    contest = models.ManyToManyField(Contest) 

class Entry(models.Model): 
    num_entries = models.IntegerField() 
    player = models.ForeignKey('Player',on_delete=models.CASCADE) 

スポーツに基づいてプレーヤーを見つけて、Entriesテーブルの利益エントリで集計関数を実行するにはどうすればよいですか?あなたはプレイヤーが複数のエントリを持つようにしたい場合は、お使いのモデルは次のようになります外部キーテーブルで集合関数を実行する

from .models import * 
from django.db.models import Avg 

player = Player.objects.filter(name='Player A').filter(contest__sport='nba').aggregate(Avg(entries__num_entries)) 
+0

あなたの 'Entries'モデルはあまり意味がありません。プレーヤーはすでに逆の外部キー関係を介して複数のエントリを持っているので、 'num_entries'のようなフィールドは必要ありません。追加の情報は保存されません。このモデルは何を表していますか?モデルは通常、テーブル内に1行を定義するため、複数形ではありません。テーブルはエントリですが、モデルは1つのエントリを定義します。名前は「Entry」にする必要があります。 – trixn

+0

私のモデルにはもっと多くのフィールドが含まれていますが、簡単にするために、私は最小値を掲示しました。あなたの権利は、エントリーではなくエントリーでなければなりません。 –

+0

しかし、 'Entry'モデルに' num_entries'というフィールドがあるのはなぜですか?それは意味をなさない。エントリーの内容を説明してください。 – trixn

答えて

0

from django.db import models 


class Contest(models.Model): 
    sport = models.CharField(max_length=200) 

class Player(models.Model): 
    name = models.CharField(max_length=200) 
    contests = models.ManyToManyField(Contest) 

class Entry(models.Model): 
    # some entry fields 

    # every entry has one player connected, so every player can have multiple entries (One to N). The reverse field of the player will be called "entries" 
    player = models.ForeignKey('Player',on_delete=models.CASCADE, related_name='entries') 

次にあなたが数を数えることができるこれは私が撮りたかったアプローチのタイプでしたこのようなプレーヤーのエントリー:

from .models import Player 
from django.db.models import Count 

aggregate = Player.objects.filter(name='Player A', contests__sport__in=['nba']).aggregate(num_entries=Count(entries)) 
print(aggregate['num_entries']) 

あるいはさらに簡単に、あなたがこれを行うことができます:

、基本的に「フィルターは、NBAで言う以前のクエリでは

Player.objects.filter(name='Player A').filter(contest__sport='nba').aggregate(Avg(entries__num_entries)) 

player = Player.objects.aggregate(Avg(entries__num_entries)).filter(name='Player A').filter(contest__sport='nba') 

代わりに:のでORMがどのように動作するかの210

+0

フィールドの実際の値を取得する必要がありますnum_entries –

+0

私はそうは思わない([XY Problem](http://meta.stackexchange.com/questions/66377/what- is-the-xy-problem))。複数のものと呼ばれるモデルを持つことは、間違った思考プロセスをその背後に持つための指標となります。エントリーの内容を説明できますか? – trixn

+0

特定のスポーツの特定のプレーヤーのすべてのnum_entriesをフィルタリングし、集計機能を実行しようとしています。 –

0

は、おそらくクエリを逆にする必要があります次に、集計」を、後者は言いながら 『次いで』

+0

関数のパラメータとしてentries__num_entriesを入れることは、フィールド名が必要なので動作しません。それは私がやろうとしたものでした。 –

0

をフィルタリングソリューションは集合体である:

Player.objects.filter(name='Player A').filter(contest__sport='nba').aggregate(Avg('entry__num_entries')) 
関連する問題