1. 程式人生 > 程式設計 >使用django自帶的user做外來鍵的方法

使用django自帶的user做外來鍵的方法

一、使用django自帶的user做外來鍵,可以直接在model中使用。只需匯入settings模組

使用方法:
在app應用(此處是Product應用)中的models.py檔案,匯入settings模組

# Product / models.py
from django.db import models
from django.contrib.auth import settings


class Product(models.Model):
  productName = models.CharField('產品名稱',max_length=20)
  productDescription = models.CharField('產品描述',max_length=100)
  producer = models.ForeignKey(settings.AUTH_USER_MODEL,verbose_name='負責人',on_delete=models.SET_NULL,blank=True,null=True)
  createTime = models.DateTimeField('建立時間',auto_now=True)

  class Meta:
    verbose_name = '產品管理'
    verbose_name_plural = '產品管理'

  def __str__(self):
    return self.productName

在這裡插入圖片描述

二、自定義User Model

方法一、擴充套件AbstractUser類:只增加欄位

app/models.py

from django.contrib.auth.models import AbstractUser
from django.db import models

class NewUser(AbstractUser):
	new_field = models.CharField(max_length=100)

同時,需要在global_settings檔案中設定:

AUTH_USER_MODEL = "app.NewUser"

方法二、擴充套件AbstractBaseUser類

AbstractBaseUser中只包含3個field: password,last_login和is_active. 擴充套件方式同上

# django.contrib.auth.base_user
class AbstractBaseUser(models.Model):
  password = models.CharField(_('password'),max_length=128)
  last_login = models.DateTimeField(_('last login'),null=True)

  is_active = True

  REQUIRED_FIELDS = []

  # Stores the raw password if set_password() is called so that it can
  # be passed to password_changed() after the model is saved.
  _password = None

  class Meta:
    abstract = True

  def __str__(self):
    return self.get_username()

  def save(self,*args,**kwargs):
    super().save(*args,**kwargs)
    if self._password is not None:
      password_validation.password_changed(self._password,self)
      self._password = None

  def get_username(self):
    """Return the username for this User."""
    return getattr(self,self.USERNAME_FIELD)

  def clean(self):
    setattr(self,self.USERNAME_FIELD,self.normalize_username(self.get_username()))

  def natural_key(self):
    return (self.get_username(),)

  @property
  def is_anonymous(self):
    """
    Always return False. This is a way of comparing User objects to
    anonymous users.
    """
    return False

  @property
  def is_authenticated(self):
    """
    Always return True. This is a way to tell if the user has been
    authenticated in templates.
    """
    return True

  def set_password(self,raw_password):
    self.password = make_password(raw_password)
    self._password = raw_password

  def check_password(self,raw_password):
    """
    Return a boolean of whether the raw_password was correct. Handles
    hashing formats behind the scenes.
    """
    def setter(raw_password):
      self.set_password(raw_password)
      # Password hash upgrades shouldn't be considered password changes.
      self._password = None
      self.save(update_fields=["password"])
    return check_password(raw_password,self.password,setter)

  def set_unusable_password(self):
    # Set a value that will never be a valid hash
    self.password = make_password(None)

  def has_usable_password(self):
    """
    Return False if set_unusable_password() has been called for this user.
    """
    return is_password_usable(self.password)

  def get_session_auth_hash(self):
    """
    Return an HMAC of the password field.
    """
    key_salt = "django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash"
    return salted_hmac(key_salt,self.password).hexdigest()

  @classmethod
  def get_email_field_name(cls):
    try:
      return cls.EMAIL_FIELD
    except AttributeError:
      return 'email'

  @classmethod
  def normalize_username(cls,username):
    return unicodedata.normalize('NFKC',username) if isinstance(username,str) else username

到此這篇關於使用django自帶的user做外來鍵的方法的文章就介紹到這了,更多相關django user做外來鍵內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!