我有两个应用,“帐户”和“myapp”。我试图在视图中仅显示属于与request.user相同组织的教师对象。
帐户/ models.pyfrom 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
from django.contrib.auth.models import User
class Teacher(models.Model):
user = models.OneToOneField(User, related_name='teacher')
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)
我在/ homepage /获取“NameError,未定义全局名称'user'”。我想这是因为我没有正确访问每个Teacher对象的teacher.user属性,但我可能错了。
我尝试了各种反向遍历关系的组合:
user.is_active
user__is_active
user.profile.organisation
user.profile__organisation
但是上面的许多内容都给我“/ homepage / keyword中的SyntaxError不能成为表达式”,所以我认为目前的化身大致正确。
奇怪的是,过滤器的右侧似乎工作正常(= request.user.profile.organisation
部分)
答案 0 :(得分:4)
query lookups that span relationships上的文档非常有用。要意识到的是它是一个标准函数,因此左侧必须始终是单个关键字,而不是表达式。要启用此功能,请使用双下划线语法:
Teacher.objects.filter(user__profile__organisation=request.user.profile.organisation, user__is_active = True)
还要注意它是一个=
- 再次,它是一个函数调用,而不是表达式。