Подключите пользовательскую модель с пользовательской таблицей mysql - PullRequest
1 голос
/ 20 февраля 2020

Я пытался внедрить django аутентификацию из этого урока .

Это содержимое моих models.py:

import jwt

from datetime import datetime, timedelta

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

# Create your models here.

class UserManager(BaseUserManager):
  def create_user(self, username, email, password=None):
      if username is None:
         raise TypeError('Users must have a username.')

      if email is None:
         raise TypeError('Users must have an email address.')

      user = self.model(username=username, email=self.normalize_email(email))
      user.set_password(password)
      user.save()

      return user

  def create_superuser(self, username, email, password):
      if password is None:
         raise TypeError('Superusers must have a password.')

      user = self.create_user(username, email, password)
      user.is_superuser = True
      user.is_staff = True
      user.save()

      return user

class User(AbstractBaseUser, PermissionsMixin):
  username = models.CharField(db_index=True, max_length=255, unique=True)

  email = models.EmailField(db_index=True, unique=True)

  is_active = models.BooleanField(default=True)

  is_staff = models.BooleanField(default=False)

  created_at = models.DateTimeField(auto_now_add=True)

  updated_at = models.DateTimeField(auto_now=True)

  USERNAME_FIELD = 'email'
  REQUIRED_FIELDS = ['username']

  objects = UserManager()

  def __str__(self):
      return self.username

  @property
  def token(self):
      return self._generate_jwt_token()

  def get_full_name(self):
      return self.username

  def get_short_name(self):
      return self.username

  def _generate_jwt_token(self):
      dt = datetime.now() + timedelta(days=60)

      token = jwt.encode({
          'id': self.pk,
          'exp': int(dt.strftime('%s'))
      }, settings.SECRET_KEY, algorithm='HS256')

      return token.decode('utf-8')

Система аутентификации работает, но проблема теперь в том, что я хочу изменить бэкэнд пользовательской модели с существующим mysql usertable .

Вот структура таблицы usertable :

CREATE TABLE `usertable` (
 `user_id` int(100) NOT NULL,
 `username` varchar(50) NOT NULL,
 `nama` varchar(100) NOT NULL,
 `email` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Есть ли способ сделать это с наименьшим количеством усилий по рефакторингу существующей кодовой базы без нарушения схемы аутентификации?

1 Ответ

1 голос
/ 21 февраля 2020

Вы ищете вариант db_table модели. Вот документы .

class User(AbstractBaseUser, PermissionsMixin):
    class Meta:
        db_table = 'usertable'
    username = models.CharField(db_index=True, max_length=255, unique=True) # The varchar length and this length are different. I suggest modifying the table.
    email = models.EmailField(db_index=True, unique=True) # The varchar length and this length are different. I suggest modifying the table.
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    nama = models.CharField(max_length=100, null=False)

Обычно идентификатор - это поле auto, являющееся первичным ключом и автоинкрементным. Я не думаю, что user_id это так. Вы можете определить и переопределить id как autofield с db_column=user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...