Как получить дочернюю модель, имеющую отношение один к одному с моделью пользователя по умолчанию в Django?
Я создал модель, имеющую отношение один к одному с моделью User по умолчанию, чтобы расширить ее для предоставления некоторых прав для вкладок на моем сайте. Теперь я хочу не показывать опции вкладок пользователям, не имеющим прав доступа к ним.
модель разрешения пользователя:
from django.contrib.auth.models import User
class userpermissions(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
Проверка наличия или отсутствия прав у пользователя Я создал функцию, которая должна получить экземпляр модели userpermission вошедшего пользователя. Для этого я использовал следующий код ->
def check(user):
up = User.userpermissions_set.get(id=user.id)
Теперь, когда пользователь входит в систему, функция login будет вызывать эту функцию проверки и перенаправлять на вкладку, к которой пользователь имеет доступ, а также отправлять переменную up, содержащую все разрешения пользователя, чтобы темплейт Navbar мог скрыть те вкладки, к которым у пользователя нет доступа.
Теперь проблема, с которой я столкнулся - когда я запускаю сервер, он показывает эту ошибку ->
AttributeError at / объект типа 'User' не имеет атрибута 'userpermissions_set'
Я видел на YouTube, что для получения экземпляра дочерней модели (не знаю, как ее назвать...) нужно использовать ее имя all в маленьком регистре с _set (пример - parent.child_set.all() )
В соответствии с ошибкой в браузере, похоже, что это неправильный способ получения данных дочерней модели (опять же... не знаю, как это назвать...).
модель разрешения пользователя:
from django.contrib.auth.models import User
class userpermissions(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
Проверка наличия или отсутствия прав у пользователя Я создал функцию, которая должна получить экземпляр модели userpermission вошедшего пользователя. Для этого я использовал следующий код ->
def check(user):
up = User.userpermissions_set.get(id=user.id)
Теперь, когда пользователь входит в систему, функция login будет вызывать эту функцию проверки и перенаправлять на вкладку, к которой пользователь имеет доступ, а также отправлять переменную up, содержащую все разрешения пользователя, чтобы темплейт Navbar мог скрыть те вкладки, к которым у пользователя нет доступа.
Теперь проблема, с которой я столкнулся - когда я запускаю сервер, он показывает эту ошибку ->
AttributeError at / объект типа 'User' не имеет атрибута 'userpermissions_set'
Я видел на YouTube, что для получения экземпляра дочерней модели (не знаю, как ее назвать...) нужно использовать ее имя all в маленьком регистре с _set (пример - parent.child_set.all() )
В соответствии с ошибкой в браузере, похоже, что это неправильный способ получения данных дочерней модели (опять же... не знаю, как это назвать...).
Я ожидал получить все данные дочерней модели, но это не сработало...
Для создания отношения один-к-одному между дочерней моделью и моделью User по умолчанию в Django можно использовать тип поля OneToOneField. Вот пример того, как вы можете определить дочернюю модель с отношением один-к-одному к модели User: В этом примере ChildModel имеет отношение один-к-одному с моделью User, и поле user в модели ChildModel представляет это отношение. Аргумент on_delete определяет, что должно произойти с дочерней моделью при удалении связанного с ней пользователя.
Затем вы можете использовать модели ChildModel и User в вашем Django приложении следующим образом: