自定义和非托管用户模型/滞后用户表

时间:2015-12-11 12:10:05

标签: python django model permissions django-guardian

我正在尝试使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,由{{1}创建}}。因此问题归结为在django.auth

中指定用户组模型

1 个答案:

答案 0 :(得分:3)

我做了一个hacky解决方案。 guardian所做的是期望与ManyToManyUser建立auth_group关系。 AbstractUser默认情况下执行此操作,但由于我手动给出managed = Falsedb_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