2012-03-05 8 views
0

"account"와 "myapp"의 두 가지 응용 프로그램이 있습니다. request.user와 같은 조직에 속한 교사 객체 만보기로 표시하려고합니다.Django : 모델의 'user` 필드에 액세스하는 OneToOneField 관계를 탐색합니다. - NameError

계정/models.py
from django.contrib.auth.models import User 

class Organisation(models.Model): 
    name = models.CharField(max_length=100, unique=True) 
    is_active = models.BooleanField(default=True) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    organisation = models.ForeignKey(Organisation, editable=False) 
    is_organisationadmin = models.BooleanField(default=False) 

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

user.profile.organisation

MyApp를/models.py
from django.contrib.auth.models import User 

class Teacher(models.Model): 
    user = models.OneToOneField(User, related_name='teacher') 
MyApp를/전망처럼 뭔가에 의해 사용자 프로파일에게 정보에 액세스 가능 this 블로그 게시물에서 마지막 줄, .py
from myproject.account.models import Organisation, UserProfile 
from myproject.myapp.models import Teacher 
from django.contrib.auth.models import User 

def homepage(request): 
    if request.user.is_authenticated(): 
     teachers = Teacher.objects.filter(user.profile.organisation == request.user.profile.organisation, user__is_active = True) 

"/ 홈페이지/NameError, 전역 이름 '사용자'가 정의되지 않았습니다."가 표시됩니다. 저는 이것이 각 Teacher 객체의 teacher.user 속성에 올바르게 액세스하지 않아서라고 생각합니다.하지만 틀릴 수 있습니다.

user.is_active 
user__is_active 
user.profile.organisation 
user.profile__organisation 

는하지만, 위의 저를주는 많은 "홈페이지 /에서 구문 에러 것은/키워드가 표현 될 수 없다", 그래서 내 생각 :

나는 관계를 통과하는 역의 모든 종류의 조합을 시도했습니다 현재 화신은 대략 옳다.

는 이상하게도, 필터의 오른쪽은

답변

4

query lookups that span relationships의 문서는 매우 유익 잘합니다 (= request.user.profile.organisation 부분)을 작동하는 것 같다. 실현해야 할 점은 표준 함수라는 점입니다. 따라서 왼쪽은 항상 표현식이 아닌 단일 키워드 여야합니다. - 다시, 그것은 함수 호출이 아니라 표현의

Teacher.objects.filter(user__profile__organisation=request.user.profile.organisation, user__is_active = True) 

이 또한 하나의 = 주 :이 작업을 사용하려면, 이중 밑줄 구문을 사용합니다.

+0

감사합니다. 내 질문에 어딘가에 무지가 있다는 느낌이 들었다. 내가 잘못 이해 한 것은 틀린 생각으로, 관계를 뒤집으려면'child__parent__parent_field'를 사용하지만'parent.child.child_field'를 전달하십시오. 이것은 링크 된 문서의 처음 네 단락에서 밝혀졌습니다. 감사합니다. 그래도'user.profile '트릭을 사용하지 않는 것 같아서, 모든 사용자가 프로파일을 가지고 있는지 확인하고'user__userprofile'로 되돌려 놓을 것입니다. – nimasmi