2016-12-15 3 views
-1

Я пишу приложение для спортивной лиги. У меня есть модели для команд и расписания. Когда пользователь выбирает команду, они могут видеть победы, потери, связи этой команды. Я бы хотел показать все игры этой команды.Поиск внешнего ключа Django в QuerySet

Models.py

class Teams(models.Model): 
    team = models.AutoField(primary_key=True) 
    team_name = models.CharField(max_length=225, blank=True, null=True) 
    sport_id = models.ForeignKey(Sports, models.DO_NOTHING, blank=True, null=True) 
    division = models.CharField(max_length=225, blank=True, null=True) 
    school = models.ForeignKey(School, models.DO_NOTHING, blank=True, null=True) 
    win = models.IntegerField(blank=True, null=True, default=0) 
    loss = models.IntegerField(blank=True, null=True, default=0) 
    tie = models.IntegerField(blank=True, null=True, default=0) 

    class Meta: 
     managed = True 
     db_table = 'teams' 
    def __str__(self): 
     return self.team_name 

class Schedule(models.Model): 
    match = models.AutoField(primary_key=True) 
    match_date = models.DateField(blank=True, null=True) 
    home = models.ForeignKey(Teams, related_name='home_set', blank=True, null=True) 
    away = models.ForeignKey(Teams, related_name='away_set', blank=True, null=True) 
    home_score = models.IntegerField(blank=True, null=True) 
    away_score = models.IntegerField(blank=True, null=True) 
    class Meta: 
     managed = True 
     db_table = 'schedule' 
    def __str__(self): 
     return '%s at %s' % (self.away, self.home) 

И мои соответствующие взгляды:

class TeamView(generic.TemplateView): 
    template_name = "teamsports/teamview.html" 

    def get_context_data(self, **kwargs): 
     context = super(TeamView, self).get_context_data(**kwargs) 
     q = self.request.GET.get('team_name') 
     context['team'] = Teams.objects.get(team=q) 
     context['game_list']=Schedule.objects.filter(home=q).values() | Schedule.objects.filter(away=q).values() 
     return context 

Шаблон:

{% extends 'base.html' %} 
{% block content %} 
    <h1>Team Name: {{ team }}</h1> 
    <h1>Wins: {{ team.win }}</h1> 
    <h1>Losses: {{ team.loss }}</h1> 

    <h1>Results: </h1> 
     <h1>{% for game_list in game_list|dictsort:"match_date" %}</h1> 
      <p>Date: {{game_list.match_date|date }} Home Team: {{ game_list.home_team }} Score: {{ game_list.home_score }} Away Team: {{ game_list.away_team }} Score {{ game_list.away_score|linebreaksbr }}</p> 
      {% endfor %} 

    <li><a href="/standings/">Pick another, ya jabroni</a></li> 

{% endblock %} 

Это работает! Но команды в «game_list» отображаются как их идентификационные номера, а не имена. Как мне оглянуться на мою модель команды, чтобы получить название команды? Вещи, которые я пробовал:

  1. Пишущие большой запрос с дома и на выезде игр с использованием .values ​​(TEAM_NAME). Ошибка в полях запроса, которые не совпадают, что имеет смысл для меня.

  2. Написание отдельного изображения для предстоящих игр и использование "include". Все еще есть проблема, соответствующая противостоящей команде к игре.

Вещи Я рассмотрел:

  1. Написать шаблонный тег

  2. This или с помощью Q

Любое руководство будет оценено

ответ

0

Почему вы используете values() во всех запросах? Это превращает данные из экземпляров модели Django - с возможностью отслеживания внешних ключей - в немые словари.

Вместо этого вы должны сделать один запрос, чтобы получить все ваши совпадения, отсортировать его в самом запросе и вернуть это.

from django.db.models import Q 
game_list = Schedule.objects.filter(Q(home=q) | Q(away=q)).order_by('match_date').select_related('home', 'away') 

Предложение select_related не требуется, но делает следуя FKs в шаблоне более эффективной.

Теперь ваш шаблон может быть просто:

{% for game in game_list %} 
    <p>Date: {{ game.match_date|date }} Home Team: {{ game.home.team_name }} Score: {{ game.home_score }} Away Team: {{ game.away.team_name }} Score {{ game.away_score }}</p> 
{% endfor %} 
+0

Спасибо, Даниил. Я все еще читаю на Q, поэтому я понимаю это лучше, но я получаю сообщение об ошибке. Объект «Q» не имеет атрибута «order_by». –

+0

Хм, вы уверены, что у вас есть круглые скобки в нужном месте? Есть два близких parens после второго Q. –

+0

OK - это было исправлено. Но теперь созданный шаблон не отображает никаких данных. Есть идеи? –

Смежные вопросы