2017-02-02 2 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) 

Как я могу найти поиск игрока на основе спорта, а затем запустить функцию агрегата в записи прибыли в таблице «Записи». Это был тип подхода, который я хотел взять:Запуск функции агрегата по таблице внешнего ключа

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

Ваша модель «Записи» не имеет большого смысла. У игрока уже есть несколько записей через обратное отношение внешних ключей, поэтому нет необходимости в поле типа 'num_entries', и кроме этого он не хранит никакой дополнительной информации. Что представляет собой эта модель? Модель обычно не является чем-то множественным, потому что она определяет одну строку в таблице. Таблица - это ваши записи, но модель определяет одну запись. Так что это имя должно быть «Entry». – trixn

+0

Мои модели содержат больше полей, но для простоты я опубликовал минимальный минимум. Ваше право, это должен быть Entry, а не записи. –

+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']) 

Или еще проще, вы можете сделать это:

from .models import Entry 

num_entries = Entry.objects.filter(player__name='Player A', player__contests__sport__in=['nba']).count() 
+0

Мне нужно захватить фактическое значение в поле num_entries –

+0

Я так не думаю ([XY Problem] (http://meta.stackexchange.com/questions/66377/what- это-The-ху-проблема)). Наличие модели, которая называется множественным числом, является индикатором того, что за ней происходит неправильный процесс размышления. Не могли бы вы объяснить, что представляет запись? – trixn

+0

Im пытается отфильтровать все num_entries определенного игрока для определенного вида спорта и запустить функцию агрегата на нем –

0

Из-за того, как работает ORM, вам, вероятно, нужно обратить запрос:

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

вместо:

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

В первом запросе в основном говорит «Фильтровать по НБА, то агрегат»в то время как последний говорит„Совокупные, затем фильтр“

+0

, поместив записи__num_entries, поскольку параметр функции не работает, так как он ожидает имя поля. Это то, что я пытался сделать, и это не сработало. –

0

решение:

Player.objects.filter(name='Player A').filter(contest__sport='nba').aggregate(Avg('entry__num_entries')) 
Смежные вопросы