使用现有表进行Django身份验证

问题描述

我正在将应用程序从Java迁移到Django。由于此应用程序具有旧版数据库,我该如何在不更改其架构的情况下将现有表(成员)用于Django身份验证。

下面是成员表

       Column       |          Type          | Collation | Nullable | Default | Storage  | Stats target | Description 
--------------------+------------------------+-----------+----------+---------+----------+--------------+-------------
 member_id          | bigint                 |           | not null |         | plain    |              | 
 membertypeid       | integer                |           |          |         | plain    |              | 
 email              | character varying(100) |           |          |         | extended |              | 
 password           | character varying(100) |           |          |         | extended |              | 
 challenge_question | character varying(100) |           |          |         | extended |              | 
 challenge_answer   | character varying(100) |           |          |         | extended |              | 
 datedisabled       | character varying(255) |           |          |         | extended |              | 
 disabled           | boolean                |           |          |         | plain    |              | 
 profiletype        | integer                |           |          |         | plain    |              |

我尝试过的是

from django.contrib.auth.models import (
    AbstractBaseUser,PermissionsMixin,BaseUserManager
)


class UserManager(BaseUserManager):
    def _create_user(self,email,password,**extra_fields):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('The given email must be set')
        try:
            user = self.model(email=email,**extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
        except:
            raise
 
    def create_user(self,password=None,**extra_fields):
        return self._create_user(email,**extra_fields)
 
    def create_superuser(self,password=password,**extra_fields)


class User(AbstractBaseUser,PermissionsMixin):
    member_id = models.BigIntegerField(primary_key=True)
    membertypeid = models.IntegerField(blank=True,null=True)
    email = models.CharField(max_length=100,blank=True,null=True,unique=True)
    password = models.CharField(max_length=100,null=True)
    challenge_question = models.CharField(max_length=100,null=True)
    challenge_answer = models.CharField(max_length=100,null=True)
    datedisabled = models.CharField(max_length=255,null=True)
    disabled = models.BooleanField(blank=True,null=True)
    profiletype = models.IntegerField(blank=True,null=True)
 
    objects = UserManager()
 
    USERNAME_FIELD = 'email'
 
    def save(self,*args,**kwargs):
        super(User,self).save(*args,**kwargs)
        return self

    class Meta:
        db_table = "members"
        managed = False

我得到的错误是-

python manage.py createsuperuser
Email: a@b.com
Traceback (most recent call last):
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/backends/utils.py",line 84,in _execute
    return self.cursor.execute(sql,params)
psycopg2.errors.UndefinedColumn: column members.last_login does not exist
LINE 1: SELECT "members"."last_login","members"."is_superuser","me...
               ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py",line 21,in <module>
    main()
  File "manage.py",line 17,in main
    execute_from_command_line(sys.argv)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/core/management/__init__.py",line 381,in execute_from_command_line
    utility.execute()
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/core/management/__init__.py",line 375,in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/core/management/base.py",line 323,in run_from_argv
    self.execute(*args,**cmd_options)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py",line 61,in execute
    return super().execute(*args,**options)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/core/management/base.py",line 364,in execute
    output = self.handle(*args,**options)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py",line 95,in handle
    error_msg = self._validate_username(username,verbose_field_name,database)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py",line 201,in _validate_username
    self.usermodel._default_manager.db_manager(database).get_by_natural_key(username)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/contrib/auth/base_user.py",line 44,in get_by_natural_key
    return self.get(**{self.model.USERNAME_FIELD: username})
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/manager.py",line 82,in manager_method
    return getattr(self.get_queryset(),name)(*args,**kwargs)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/query.py",line 402,in get
    num = len(clone)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/query.py",line 256,in __len__
    self._fetch_all()
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/query.py",line 1242,in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/query.py",line 55,in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch,chunk_size=self.chunk_size)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/models/sql/compiler.py",line 1097,in execute_sql
    cursor.execute(sql,params)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/backends/utils.py",line 99,in execute
    return super().execute(sql,line 67,in execute
    return self._execute_with_wrappers(sql,params,many=False,executor=self._execute)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/backends/utils.py",line 76,in _execute_with_wrappers
    return executor(sql,many,context)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/backends/utils.py",params)
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/utils.py",line 89,in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/amity/.local/share/virtualenvs/drf-jwt-auth-RVtih8KZ/lib/python3.8/site-packages/django/db/backends/utils.py",params)
django.db.utils.ProgrammingError: column members.last_login does not exist
LINE 1: SELECT "members"."last_login","me...

注意-我无法在表格中添加额外的列

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)