自定义和非托管用户 Model/Lagacy 用户 Table
Custom and Unmanaged User Model/Lagacy User Table
我正在尝试让 django-guardian
使用我的自定义用户模型。该模型继承自 AbstractUser
,也继承自 GuardianUserMixin
。这是 User
型号:
class User(AbstractUser, GuardianUserMixin):
class Meta:
managed = False
db_table = 'users'
我遇到的问题是在检查权限时。例如这里 request.user.has_perm(...)
这是错误消息:
ProgrammingError at /manageDb/mira/follow/14/
relation "users_groups" does not exist
LINE 1: ...sion"."group_id" = "auth_group"."id" ) INNER JOIN "users_gro...
回溯:
File "/home/khajvah/Project/mira_website/manageDb/views.py" in delete
486. if request.user.has_perm('follow', follow_object):
File "/usr/local/lib/python3.4/dist-packages/django/contrib/auth/models.py" in has_perm
353. return _user_has_perm(self, perm, obj)
File "/usr/local/lib/python3.4/dist-packages/django/contrib/auth/models.py" in _user_has_perm
281. if backend.has_perm(user, perm, obj):
File "/usr/local/lib/python3.4/dist-packages/guardian/backends.py" in has_perm
89. return check.has_perm(perm, obj)
File "/usr/local/lib/python3.4/dist-packages/guardian/core.py" in has_perm
54. return perm in self.get_perms(obj)
File "/usr/local/lib/python3.4/dist-packages/guardian/core.py" in get_perms
110. perms = list(set(chain(user_perms, group_perms)))
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in __iter__
162. self._fetch_all()
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in _fetch_all
965. self._result_cache = list(self.iterator())
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in iterator
1217. for row in compiler.results_iter():
File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/compiler.py" in results_iter
794. results = self.execute_sql(MULTI)
File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/compiler.py" in execute_sql
840. cursor.execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
79. return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/utils.py" in __exit__
97. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python3.4/dist-packages/django/utils/six.py" in reraise
658. raise value.with_traceback(tb)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
问题似乎是 guardian
正在对不存在的 table users_groups
进行查询,相反,它被称为 auth_groups
,它由 django.auth
创建。所以问题归结为在 guardian
中指定用户组模型
我做了一个 hacky 解决方案。 guardian
所做的是期待与 User
和 auth_group
建立 ManyToMany
关系。 AbstractUser
默认执行此操作,但由于我已手动指定 managed = False
和 db_table
,Django 在迁移时未创建关系,因此我为关系创建了一个中间模型,并在此处我的 model.py
的一部分是这样的:
class User(AbstractBaseUser, PermissionsMixin, GuardianUserMixin):
username=models.CharField(unique=True, max_length=123)
date_joined = models.DateTimeField(default=datetime.now())
email=models.CharField(unique=True, max_length=125)
first_name=models.CharField(max_length=128)
last_name=models.CharField(max_length=128)
is_staff = models.NullBooleanField(null=True)
is_active = models.NullBooleanField(null=True)
USERNAME_FIELD='username'
REQUIRED_FIELDS = ['password', 'email', 'first_name', 'last_name']
objects = UserManager()
class Meta:
managed = False
db_table = 'users'
class GroupUser(models.Model):
group = models.ForeignKey(Group)
user = models.ForeignKey(User)
class Meta:
db_table = 'users_groups'
关键是让组 table 有正确的名称。 IE。监护人正在等待 userTableName_groups
。
我正在尝试让 django-guardian
使用我的自定义用户模型。该模型继承自 AbstractUser
,也继承自 GuardianUserMixin
。这是 User
型号:
class User(AbstractUser, GuardianUserMixin):
class Meta:
managed = False
db_table = 'users'
我遇到的问题是在检查权限时。例如这里 request.user.has_perm(...)
这是错误消息:
ProgrammingError at /manageDb/mira/follow/14/
relation "users_groups" does not exist
LINE 1: ...sion"."group_id" = "auth_group"."id" ) INNER JOIN "users_gro...
回溯:
File "/home/khajvah/Project/mira_website/manageDb/views.py" in delete
486. if request.user.has_perm('follow', follow_object):
File "/usr/local/lib/python3.4/dist-packages/django/contrib/auth/models.py" in has_perm
353. return _user_has_perm(self, perm, obj)
File "/usr/local/lib/python3.4/dist-packages/django/contrib/auth/models.py" in _user_has_perm
281. if backend.has_perm(user, perm, obj):
File "/usr/local/lib/python3.4/dist-packages/guardian/backends.py" in has_perm
89. return check.has_perm(perm, obj)
File "/usr/local/lib/python3.4/dist-packages/guardian/core.py" in has_perm
54. return perm in self.get_perms(obj)
File "/usr/local/lib/python3.4/dist-packages/guardian/core.py" in get_perms
110. perms = list(set(chain(user_perms, group_perms)))
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in __iter__
162. self._fetch_all()
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in _fetch_all
965. self._result_cache = list(self.iterator())
File "/usr/local/lib/python3.4/dist-packages/django/db/models/query.py" in iterator
1217. for row in compiler.results_iter():
File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/compiler.py" in results_iter
794. results = self.execute_sql(MULTI)
File "/usr/local/lib/python3.4/dist-packages/django/db/models/sql/compiler.py" in execute_sql
840. cursor.execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
79. return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.4/dist-packages/django/db/utils.py" in __exit__
97. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python3.4/dist-packages/django/utils/six.py" in reraise
658. raise value.with_traceback(tb)
File "/usr/local/lib/python3.4/dist-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
问题似乎是 guardian
正在对不存在的 table users_groups
进行查询,相反,它被称为 auth_groups
,它由 django.auth
创建。所以问题归结为在 guardian
我做了一个 hacky 解决方案。 guardian
所做的是期待与 User
和 auth_group
建立 ManyToMany
关系。 AbstractUser
默认执行此操作,但由于我已手动指定 managed = False
和 db_table
,Django 在迁移时未创建关系,因此我为关系创建了一个中间模型,并在此处我的 model.py
的一部分是这样的:
class User(AbstractBaseUser, PermissionsMixin, GuardianUserMixin):
username=models.CharField(unique=True, max_length=123)
date_joined = models.DateTimeField(default=datetime.now())
email=models.CharField(unique=True, max_length=125)
first_name=models.CharField(max_length=128)
last_name=models.CharField(max_length=128)
is_staff = models.NullBooleanField(null=True)
is_active = models.NullBooleanField(null=True)
USERNAME_FIELD='username'
REQUIRED_FIELDS = ['password', 'email', 'first_name', 'last_name']
objects = UserManager()
class Meta:
managed = False
db_table = 'users'
class GroupUser(models.Model):
group = models.ForeignKey(Group)
user = models.ForeignKey(User)
class Meta:
db_table = 'users_groups'
关键是让组 table 有正确的名称。 IE。监护人正在等待 userTableName_groups
。