2012-03-05 9 views
0

私は2つのアプリ" account "と" myapp "を持っています。私は、request.userと同じ組織に属する教師オブジェクトだけを表示するようにしています。 user.profile.organisationDjango:モデルの `user`フィールドにアクセスするOneToOneField関係をトラバースする - NameError

myappに/ models.py
from django.contrib.auth.models import User 

class Teacher(models.Model): 
    user = models.OneToOneField(User, related_name='teacher') 
myappに/ビューのようなもので、ユーザプロファイル情報にアクセスできます thisブログ記事から

アカウント/ 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]) 

注最後の行、 .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) 

「/ homepage /にNameErrorが発生しました。グローバル名 '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'を転送します。これはあなたがリンクしたドキュメントの最初の4つの段落にあるので、ありがたいです。しかし、 'user.profile'トリックではうまく動作しなかったので、すべてのユーザがプロファイルを持っていることを確認して、' user__userprofile'に戻します。 – nimasmi

関連する問題