使用django自帶的user做外來鍵的方法
阿新 • • 發佈:2020-12-01
一、使用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類
# 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做外來鍵內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!