使用django自带的user做外键的方法
作者:汤圆儿2019 时间:2023-04-16 06:54:36
一、使用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'), blank=True, 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
来源:https://blog.csdn.net/weixin_38851970/article/details/107487110
标签:django,user,外键
0
投稿
猜你喜欢
用js+cookie记录滚动条位置
2024-06-05 09:11:02
golang copy函数使用的坑
2023-07-09 19:53:44
DreamweaverMX2004技巧两则
2010-09-05 21:10:00
pytorch Dropout过拟合的操作
2023-11-26 16:12:18
Javascript 常见的高阶函数详情
2024-04-18 09:30:22
也谈用户体验
2009-07-15 12:56:00
用python画圣诞树三种代码示例介绍
2023-03-24 08:15:01
艺术和设计之间的差别
2010-11-17 19:28:00
Sql Server表死锁的解决方法分享
2011-09-01 19:08:00
python批量读取txt文件为DataFrame的方法
2021-09-29 12:04:21
python脚本实现统计日志文件中的ip访问次数代码分享
2021-03-17 08:40:08
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2021-02-14 09:40:46
python如何为list实现find方法
2022-01-14 09:15:56
[设计]DREAMWEAVER 问题集锦
2010-09-02 12:31:00
实例讲解如何配置MySQL数据库主从复制
2008-12-17 15:33:00
Python实战之能监控文件变化的神器—看门狗
2022-01-05 22:01:28
pycharm 如何取消连按两下shift出现的全局搜索
2023-08-24 17:44:12
vue获取data数据改变前后的值方法
2024-04-30 10:35:10
利用JavaScript实现防抖节流函数的示例代码
2024-05-11 09:31:55
讲解使用SQL Server升级顾问的详细步骤
2009-01-04 14:14:00