2015-04-25 2 views
1

Привет команде StackOverflow,Джанго - Как связать столов

Я следующие две таблицы: Джанго

class StraightredFixture(models.Model): 
    fixtureid = models.IntegerField(primary_key=True) 
    soccerseason = models.IntegerField(db_column='soccerSeason') # Field name made lowercase. 
    hometeamid = models.IntegerField() 
    awayteamid = models.IntegerField() 
    fixturedate = models.DateTimeField() 
    fixturestatus = models.CharField(max_length=24) 
    fixturematchday = models.IntegerField() 
    hometeamscore = models.IntegerField() 
    awayteamscore = models.IntegerField() 

    class Meta: 
     managed = False 
     db_table = 'straightred_fixture' 

class StraightredTeam(models.Model): 
    teamid = models.IntegerField(primary_key=True) 
    teamname = models.CharField(max_length=36) 
    teamcode = models.CharField(max_length=5) 
    teamshortname = models.CharField(max_length=24) 

    class Meta: 
     managed = False 
     db_table = 'straightred_team' 

В views.py я знаю, что я могу поставить следующее, и она работает отлично :

def test(request): 
    fixture = StraightredFixture.objects.get(fixtureid=136697) 
    return render(request,'straightred/test.html',{'name':fixture.hometeamid}) 

Как я уже говорил выше, это все работает хорошо, но я ищу, чтобы вернуть teamname в hometeamid, которую можно найти в модели StraightredTeam.

После некоторого осмотра меня подтолкнули в сторону «select_related», но я не понимаю, как его реализовать в моих существующих таблицах, а также если это наиболее эффективный способ для этого типа запросов. Он чувствует себя хорошо.

Обратите внимание, что этот код был создан с использованием «python manage.py inspectdb».

Любые советы на этом этапе были бы весьма полезными. Большое спасибо, Алан.

+0

Я уверен, что этот код был созданный с помощью 'python manage.py inspectdb', если да, укажите его в своем вопросе. – aumo

+1

Вы, сэр, гений. Я обновил вопрос по запросу. –

ответ

1

См. model relationships.

Django предоставляет специальные поля модели для управления отношениями таблиц. В соответствии с вашими потребностями ForeignKey.

Вместо того, чтобы объявить:

hometeamid = models.IntegerField() 
awayteamid = models.IntegerField() 

, который я предполагаю, что это результат python manage.py inspectdb, вы бы объявить:

home_team = models.ForeignKey('<app_name>. StraightredTeam', db_column='hometeamid', related_name='home_fixtures') 
away_team = models.ForeignKey('<app_name>. StraightredTeam', db_column='awayteamid', related_name='away_fixtures') 

Делая эту волю, вы говорите Django ORM, чтобы урегулировать отношения по капот, который позволит вам делать такие вещи, как:

fixture = StraightredFixture.objects.get(fixtureid=some_fixture_id) 
fixture.home_team # Returns the associated StraightredTeam instance. 

team = StraightredTeam.objects.get(team_id=some_team_id) 
team.home_fixtures.all() # Return all at home fixtures for that team. 
+1

Оцените ответ. Вы не только ответили на этот вопрос, но и поднялись выше и выше. Большое спасибо, Алан. –

1

Я не уверен, если это имеет смысл для Managed=False, но я полагаю, что вменяемый способ сделать это в Django будет с

home_team = models.ForeignKey('StraightRedFixture', db_column='fixtureid')) 

, а затем просто использовать fixture.home_team вместо делать запросы вручную.

+1

Извините, мне жаль, что я не могу принять два ответа. Я попытался, но это не позволяет. Позор Я не могу дать процент от каждого ответа. Бит, который произвел на меня наибольшее впечатление, был в ответе aumo, где он правильно догадался, что он был создан результатом python manage.py inspectdb. Я бы поднял тебя, но я пока не могу, так как мне не разрешают. Я обещаю вернуться и отступить, как только смогу. –

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