Как отобразить данные двух разных моделей на одной HTML-странице - PullRequest
1 голос
/ 22 апреля 2019

У меня есть две таблицы, одна из которых называется PlayerLkup, которая содержит информацию об игроке и служит справочной таблицей.У меня есть другая таблица (называемая BattingStats), которая содержит статистику игрока (и playerid).Таблица BattingStats «один ко многим» (playerid указана несколько раз, по одному разу за каждый сыгранный ими сезон).

Мои данные из PlayerLkup отображаются нормально, и они используютplayerid в URL-адресе для получения конкретного игрока.Мой вопрос: как мне использовать данные из моей BattingStats модели / таблицы на той же странице?Я предполагаю, что моя страница просмотров - это место, где должна быть выполнена работа.Есть ли способ передать несколько моделей в одно представление?Я пробовал один и тот же URL, разные взгляды.Это не похоже на работу для меня.Что мне нужно сделать?Любая помощь здесь будет оценена.

Я публиковал этот вопрос раньше (и с тех пор удалил его), но кто-то по ошибке пометил его как дубликат, поэтому он не получил никакого внимания.

models.py

class BattingStats(models.Model):
    playerid = models.CharField(db_column='playerID', max_length=9)
    year = models.IntegerField(db_column='Year', blank=True, null=True)
    g = models.IntegerField(db_column='G', blank=True, null=True)
    ab = models.IntegerField(db_column='AB', blank=True, null=True)
    r = models.IntegerField(db_column='R', blank=True, null=True)
    hr = models.IntegerField(db_column='HR', blank=True, null=True)
    rbi = models.IntegerField(db_column='RBI', blank=True, null=True)
    sb = models.IntegerField(db_column='SB', blank=True, null=True)

class PlayerLkup(models.Model):
    playerid = models.CharField(db_column='playerID', primary_key=True, max_length=255)
    birthyear = models.IntegerField(db_column='birthYear', blank=True, null=True)
    birthmonth = models.IntegerField(db_column='birthMonth', blank=True, null=True)
    birthday = models.IntegerField(db_column='birthDay', blank=True, null=True)
    birthstate = models.CharField(db_column='birthState', max_length=255, blank=True, null=True)
    birthcity = models.CharField(db_column='birthCity', max_length=255, blank=True, null=True)
    namefirst = models.CharField(db_column='nameFirst', max_length=255, blank=True, null=True)
    namelast = models.CharField(db_column='nameLast', max_length=255, blank=True, null=True)
    weight = models.IntegerField(blank=True, null=True)
    height = models.IntegerField(blank=True, null=True)

views.py

def player_info(request, playerid):
    playerdata = PlayerLkup.objects.get(playerid=playerid)
    return render(request, 'careerstats/playerpage.html', {'playerdata': playerdata})

urls.py

urlpatterns = [
    path('player/<str:playerid>/', views.player_info, name='player_info'),

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Вы можете делать все что угодно в представлении и передавать столько моделей, сколько хотите в контексте.

Но в вашем случае вам на самом деле не нужно менять вид, но вы должны менять модели. Похоже, что BattingStats должен иметь отношение к PlayerLkup через поле playerid. Вы должны сделать это ForeignKey (и назовите его player) - обратите внимание, что вам вообще не нужно менять базовые таблицы вообще, что может быть важно, так как это выглядит как устаревшая база данных.

class BattingStats(models.Model):
    player = models.ForeignKey('PlayerLkup', db_column='playerID')

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

{{ playerdata.namefirst }}
{% for stat in playerdata.battingstats_set.all %}
  {{ stat.year }}
  {{ stat.g }}
  ... 
{% endfor %}

(Также, пожалуйста, дайте более точные имена вашим полям. Они не обязательно должны совпадать со столбцом db, для этого и нужен атрибут db_column. Нет смысла использовать односимвольные имена полей, такие как g.)

0 голосов
/ 22 апреля 2019

На всякий случай, если вы не хотите менять свою модель (я бы), вы можете:

def player_info(request, playerid):
    playerdata = PlayerLkup.objects.get(playerid=playerid)
    battingdata = BattingStats.objects.get(playerid=playerid)
    data = {
         'playerdata': playerdata,
         'battingdata': battingdata
    }
    return render(request, 'careerstats/playerpage.html', data)

В вашем шаблоне вы будете одновременно playerdata и battingdata доступны в качестве переменных шаблона.

...