2009-10-29 1 views
2

오브젝트 나는 한 다음 모델올바른 방법은

class Person(models.Model): 
    name = models.CharField(max_length=100) 

class Employee(Person): 
    job = model.Charfield(max_length=200) 

class PhoneNumber(models.Model): 
    person = models.ForeignKey(Person) 

어떻게 내가 직원 ID가있을 경우 직원과 관련된 PHONENUMBERS에 액세스합니까?

현재 내가

phones = PhoneNumbers.objects.filter(person__id=employee.id)
를 사용하고 있는데이 employee.id 및 person.id가 같은 값 것을 알고 있기 때문에 그것은 단지 작동하지만이 그것을 할 잘못된 방법입니다 확신합니다.

감사
앤드류

답변

4

당신이 할 수있는 하나 개 DB를 쿼리에서 당신에게 당신의 전화 번호를 받아야

employees = Employee.objects.filter(id=your_id).select_related() 
if employees.count() == 1: 
    phone_numbers = employees[0].phonenumber_set.all() 

.

기본적으로 "모든 소문자의 모델 이름"과 "_set"을 사용하여 "반대쪽"에서 외래 키를 통해 관련된 모델에 액세스 할 수 있습니다. 외부 키의 관련 이름 속성을 설정하여 해당 액세서의 이름을 변경할 수 있습니다.

+1

길이를 확인할 필요가 없습니다 :. Employee.objects.select_releated()를 얻을 (ID = your_id) .phonenumber_set.all() –

+0

존재하지 않는 객체를 get하면 예외가 발생합니다. 필터를 수행하고 길이를 확인하거나 try/except에서 get을 래핑해야합니다. 귀하의 답변은 괜찮지 만 귀하의 의견은 나쁜 조언입니다. –

+0

나는 그것을 할 수있는 확실한 방법이 있다는 것을 알았다. 고마워, 너 도움을 청하러. –

5

당신은 (그리고해야한다) 외래 키 필드 모르고 필터링 할 수 있습니다

PhoneNumber.objects.filter(employee=your_employee).all() 
+0

정확하게, id 필드를 비교할 필요조차 없다. 모델은 자동으로 그렇게한다. – Soviut