2012-03-05 94 views
0

我有兩個應用程序,「帳戶」和「myapp」。我試圖在視圖中僅顯示與request.user屬於同一組織的那些教師對象。Django:遍歷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]) 

注意最後一行,從this博客文章,可以解決一些訪問用戶的個人資料信息,如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 /人次.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 at/homepage /,全局名'user'未定義」。我認爲這是因爲我沒有正確訪問每個教師對象的teacher.user屬性,但我可能是錯的。

我已經試過各種穿越的關係相反的組合:

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

但許多上面給我的「在/主頁的SyntaxError /關鍵字不能是一個表達式」,所以我覺得目前的化身大致是正確的。

奇怪的是,過濾器的右手邊似乎很好地工作(在= request.user.profile.organisation部分)

回答

4

query lookups that span relationships的文檔是相當翔實。要實現的是這是一個標準功能,所以左側必須始終是單個關鍵字,而不是表達式。爲了實現這一點,使用雙下劃線的語法:

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 2012-03-06 07:36:14