2012-08-23 3 views
20

ForeignKey를 사용하여 관련이있는 두 개의 모델이 있고 related_name이 사용됩니다. 다음은 그 예입니다.Django에서 related_name을 올바르게 사용하기

class Student(models.Model): 
    name = models.CharField(max_length=255) 
    birthday = models.DateField(blank=True) 


class Class(models.Model): 

    name = models.CharField(max_length=255) 
    student = models.ForeignKey(Student, 
           related_name='classes', 
           null=True) 

    def __unicode__(self): 
     return self.name 

예를 들어, 클래스 이름에 액세스하고 싶습니다.

이것은 내가 시도한 것입니다.

john = Student.objects.get(username = 'john') 
print john.classes.name 

아무 것도 출력되지 않습니다. 내가 john.classes

을하려고 할 때

는하지만 난 0x109911410에서 django.db.models.fields.related.RelatedManager 객체를 얻는다. 이것은 그들이 관련되어 있다는 것을 보여줍니다. 하지만 클래스 이름을 얻고 싶습니다.

내가 잘못 했나요? 어떻게 related_name을 사용하여 클래스의 이름에 액세스합니까? 지침이 필요합니다.

답변

18

예, 클래스는 관리자입니다. 한 선생님을위한 여러 반이 될 수 있습니다. 이름 출력 그래서 당신은 수행해야합니다

john = Student.objects.get(username = 'john') 
for class2 in john.classes.all(): 
    print class2.name 

을 다음 일대일 관계를 사용하여 하나의 클래스 만 학생 하나 당신이 원하는 경우. 이 경우 메소드를 사용하여 관련 필드에 액세스 할 수 있습니다.

+0

각 자식에 대해 하나의 클래스 만 있습니다. 그러면 john.classes.name은 왜 안되나요? – lakesh

+0

솔루션은 작동하지만 john.classes.name이 작동하지 않는 이유를 알고 싶습니까? – lakesh

+0

ForeignKey는 하나의 자식이 아닌 하나의 클래스에 대해 여러 클래스를 만들기 때문입니다. 한 클래스 만 원한다면 onetoone 필드를 사용하십시오. – sergzach

3

그냥 1주의 관계를 정의하는 것입니다. 따라서 학생은 여러 클래스를 가질 수 있으므로 john.classes.name은 이름을 갖고 자하는 클래스를 지정하지 않았기 때문에 작동하지 않습니다. in john.classes "classes"는 다른 Django Model Manager처럼 사용할 수있는 관리자입니다. john.classes.all() (sergzach propsed 같은)뿐만 아니라 john.classes.get (...) 또는 john.classes.filter (...)와 같은 작업을 수행 할 수 있습니다.

1

위의 예에서 테이블

john = Student.objects.get(username = 'john')  
john.classes.all().first().name # to access first row 
john.classes.all().last().name # to access last row 

의 첫 번째 행에 액세스하려면 다음과 같이 할 수있는 당신이 당신의 이름을 줄 것이다

객체를 반복하고 싶지 않아 첫 번째 행의 클래스

관련 문제