首页 > 解决方案 > 带有 UUI PK 的客户用户模型无法登录到 Django 3.0、PostgreSQL 中的管理站点

问题描述

我的客户用户模型如下所示:

class User(AbstractBaseUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    email = models.EmailField(unique=True)
    is_staff = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return self.is_admin

    def __str__(self):
        return self.email

    class Meta:
        db_table = 'login'

当我在执行 manage.py createsuperuser 后尝试登录管理员时,会引发以下错误:

ProgrammingError at /admin/
operator does not exist: integer = uuid
LINE 1: ...NER JOIN "login" ON ("django_admin_log"."user_id" = "login"....

我知道这与 PostgreSQL 的强类型和 Django 不想假设传入字段类型有关。我想解决这个问题,因为那里的许多客户用户教程都指定了 UUID 类型的主键,并且当这些步骤要求您登录到管理员并对其进行测试时,似乎没有遇到这个问题。

标签: djangopostgresqldjango-usersdjango-3.0

解决方案


我遇到了同样的问题。我的数据库中有一个名为的表users。就我而言,django_admin_log表与表有外键关系users。外键列和引用列的类型不同,这导致了问题。

外键列是INTEGER,引用列是UUID。使用以下命令删除和重新创建django_admin_log对我有用。

drop table django_admin_log

py manage.py migrate admin zero --fake
py manage.py migrate

推荐阅读