2014-01-06 2 views
0

У меня есть две таблицы, школа и баллы, в которых есть столбец «psid». Я импортирую данные из каждой таблицы в свое приложение. Я хочу связать эти две таблицы вместе с помощью ForeignKey (для одной школы может быть несколько баллов).Django ForeignKey для импортированных данных таблицы

В настоящее время мой models.py выглядит следующим образом:

class School(models.Model): 
    psid = models.CharField(primary_key=True, max_length=5) 
    city = models.CharField(max_length=100) 

class Score(models.Model): 
    psid = models.ForeignKey(School, max_length=5, db_column='psid') 
    scores = models.IntegerField(max_length=2) 

Требуется ли дополнительное поле в баллах, так что я могу как импортировать столбец PSID из исходной таблицы и имеет ForeignKey поля, которое связывает счеты и Школу вместе через колонку «psid»?

Любая помощь приветствуется.

+0

Я немного смущен, вы хотите получить связанное с ним значение psid школьного объекта или другое независимое поле для каждого объекта Score с именем psid, который не имеет отношения к столбцу psid школы (имена классов btw не должны быть множественными)? – yuvi

+0

Привет, yuvi, Да Оценка должна быть единственной. Я отредактировал вопрос, чтобы исправить это. Моя цель - получить школьный объект с использованием значения psid. В моем шаблоне я показываю оценки для каждой школы. – wsvincent

+0

Почему, по-вашему, вам нужно другое поле? –

ответ

1

Модели django, которые по большей части соединяют столы за кулисами. Для типа поля ForeignKey этого достаточно, тогда вам просто нужно использовать ORM для объединения таблиц в запросе. Вот как я бы настроить свои таблицы на основе моей лучшей интерпретации того, что вы ищете:

from django.db import models 


class School(models.Model): 
    psid = models.CharField(primary_key=True, max_length=5) 
    city = models.CharField(max_length=100) 

    def __unicode__(self): 
     return u"{0} ({1})".format(self.psid, self.city) 


class Score(models.Model): 
    school = models.ForeignKey(School, null=False, db_column="psid") 
    score = models.IntegerField() 

    def __unicode__(sefl): 
     return u"Score({0}, {1})".format(self.school.psid, self.score) 

Затем, чтобы проверить свои модели из:

$ ./manage.py syncdb 
$ ./manage.py shell 
>>> from schools.models import School, Score 
>>> school1 = School(psid="S1", city="Springfield") 
>>> school1 
S1 (Springfield) 
>>> school1.save() 
>>> School.objects.get(psid="S1") 
S1 (Springfield) 
>>> school2 = School(psid="S2", city="Springfield") 
>>> school2.save() 
>>> score1 = Score(school=school1, score=3) 
>>> score1 
Score(S1, 3) 
>>> score1.school.psid 
S1 
>>> score2 = Score(school=school1, score=2) 
>>> score3 = Score(school=school2, score=5) 
>>> score1.save() 
>>> score2.save() 
>>> score3.save() 
>>> school1.score_set.all() 
[Score(S1, 3), Score(S1, 2)] 
>>> school2.score_set.all() 
[Score(S2, 5)] 
>>> Score.objects.all() 
[Score(S1, 3), Score(S1, 2), Score(S2, 5)] 
>>> Score.objects.filter(school__psid="S1") 
[Score(S1, 3), Score(S1, 2)] 

Я надеюсь, что поможет вам.

+0

Это ОЧЕНЬ полезно. Несколько раз я работал через код оболочки, и это затвердевало для меня. Надеюсь, это будет и для других. – wsvincent

+0

По какой-то причине я не был «доверял», что ForeignKey будет работать, когда я импортирую данные для двух таблиц, и мне было неудобно делать это, как показано на рисунке. Поэтому я думал, что мне все еще нужно иметь «psid» в обеих таблицах. Просто установка «psid» как «оценка», как вы предложили (и советник Django docs), - это путь. Еще раз спасибо за то, что нашли время, чтобы разъяснить это. – wsvincent

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