Django: обход отношений OneToOneField, доступ к полю `user` модели - NameError - PullRequest
0 голосов
/ 05 марта 2012

У меня есть два приложения: «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])

Обратите внимание на последнюю строку из этого сообщения в блоге, которое позволяет получить доступ к информации профиля пользователя с помощью чего-то вроде 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 / 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)

Я получаю "NameError at / homepage /, глобальное имя 'user' не определено". Я думаю, это потому, что я неправильно обращаюсь к свойству teacher.user каждого объекта Учителя, но могу ошибаться.

Я пробовал всевозможные комбинации обратного пересечения отношений:

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

но многие из вышеперечисленных дают мне «SyntaxError в / homepage / keyword не может быть выражением», так что я думаю, что текущее воплощение примерно верно.

Как ни странно, правая часть фильтра работает нормально (часть = request.user.profile.organisation)

1 Ответ

4 голосов
/ 06 марта 2012

Документация по поисковым запросам, охватывающим отношения , довольно информативна.Необходимо понимать, что это стандартная функция, поэтому в левой части всегда должно быть одно ключевое слово, а не выражение.Чтобы включить это, используйте синтаксис с двойным подчеркиванием:

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

Также обратите внимание, что это одиночный = - опять же, это вызов функции, а не выражение.

...