2013-09-22 3 views
1

Итак, я изучаю Django и пытаюсь получить значения через внешний ключ, используя только функции Django ORM. У меня есть две таблицы: Таблица пользователей (системная таблица Django auth_user по умолчанию) и таблица Student, содержащая student_id, user_id (FK) и nr_indeksu (это номер, содержащий дополнительную информацию для конкретной информации о студенте).Django Foreign Key QuerySet (join)

class Student(models.Model): 
    user = models.ForeignKey(User) 
    nr_indeksu = models.BigIntegerField() 

    def __unicode__(self): 
     return unicode(self.user 

Я хочу получить nr_indeksu через пользовательскую модель. Другими словами, выполнить этот запрос (с использованием QuerySet):

SELECT nr_indeksu FROM auth_user 
INNER JOIN courses_student on auth_user.id = courses_student.user_id; 

Я попытался с помощью select_related функции():

u = User.objects.select_related().get(pk=2) 

, но когда я пытаюсь получить доступ к nr_indeksu:

u.nr_indeksu 

я что пользовательский объект не имеет атрибута (он имеет смысл, потому что nr_indeksu находится в модели Student, но не должен ли я получать его от пользователя?)

ответ

3

Помните, что ForeignKey является отношением «один ко многим»: для каждого ученика есть много пользователей. Из объекта пользователя вы можете получить доступ к связанным ученикам, выполнив user_obj.student_set.all().

0
s = Student.objects.get(user__id=2) 

s.nr_indeksu 
+0

Дело в том, что я хочу получить nr_indeksu из модели пользователя, используя отношения JOIN и FK, вы отвечаете просто просто SELECT WHERE от модели Student – Malyo

+1

Нет, это не так. 'user__id = 2' означает' Select * from USER, где user_id = 2; '. Это похоже на подзапрос. – sachitad

+0

Хорошо, я вижу, спасибо - но все же я хотел бы получить доступ к студентам из объекта пользователя – Malyo

1

Добавление ответа Даниила, вы можете также использовать related_names, прямо сейчас, когда вы должны сделать обратный иностранной просмотр ключа, вам нужно написать: -

user_obj.student_set.all() 

Однако, с атрибутом related_name, образец будет выглядеть так: -

class Student(models.Model): 
    user = models.ForeignKey(User, related_name='studentuser') 
    nr_indeksu = models.BigIntegerField() 

    def __unicode__(self): 
     return unicode(self.user 

то для обратного поиска, вам нужно написать: -

user_obj.studentuser.all() 

В принципе, все, что я хочу сказать, вы можете предоставить собственные имена для обратного поиска, передав атрибут related_name, если в случае, если вы не хотите использовать имя по умолчанию, используемое django, которое обычно имеет форму <foreign_key_name>_set например. в вашем случае это student_set.