Django:遍历 OneToOneField 关系,访问模型的“user”字段 - NameError

nim*_*smi 1 django one-to-one user-profile nameerror

我有两个应用程序,“account”和“myapp”。我试图在视图中仅显示那些与 request.user 属于同一组织的教师对象。

帐户/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])
Run Code Online (Sandbox Code Playgroud)

请注意此博客文章中的最后一行,它允许通过以下方式访问用户个人资料信息user.profile.organisation

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

class Teacher(models.Model):
    user = models.OneToOneField(User, related_name='teacher')
Run Code Online (Sandbox Code Playgroud) myapp/views.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)
Run Code Online (Sandbox Code Playgroud)

我收到“/homepage/ 处的 NameError,未定义全局名称“用户””。我认为这是因为我没有正确访问每个 Teacher 对象的 Teacher.user 属性,但我可能是错的。

我尝试过各种反向遍历关系的组合:

user.is_active
user__is_active
user.profile.organisation
user.profile__organisation
Run Code Online (Sandbox Code Playgroud)

但上面的许多内容给了我“/homepage/关键字的语法错误不能是表达式”,所以我认为当前的化身大致是正确的。

奇怪的是,过滤器的右侧似乎工作正常(该= request.user.profile.organisation部分)

Dan*_*man 5

关于跨越关系的查询查找的文档非常丰富。要认识到它是一个标准函数,因此左侧必须始终是单个关键字,而不是表达式。要启用此功能,请使用双下划线语法:

Teacher.objects.filter(user__profile__organisation=request.user.profile.organisation, user__is_active = True)
Run Code Online (Sandbox Code Playgroud)

另请注意,它是一个单一的=- 再次强调,它是一个函数调用,而不是一个表达式。