我正在尝试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
是正在对users_groups
不存在的表进行查询,而是将其称为auth_groups
,由创建django.auth
。因此,问题归结为在中指定用户组模型guardian
我提出了一个棘手的解决方案。正在guardian
做的事情是期望ManyToMany
与User
和建立联系auth_group
。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'
关键是使组表具有正确的名称。即监护人正在等待userTableName_groups
。