使用django自带的user做外键的方法


Posted in Python onNovember 30, 2020

一、使用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

使用django自带的user做外键的方法

二、自定义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

到此这篇关于使用django自带的user做外键的方法的文章就介绍到这了,更多相关django user做外键内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
python 定义给定初值或长度的list方法
Jun 23 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
python 实现简易的记事本
Nov 30 #Python
详解pycharm自动import所需的库的操作方法
Nov 30 #Python
Django REST Framework 分页(Pagination)详解
Nov 30 #Python
python代码实现猜拳小游戏
Nov 30 #Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 #Python
python 如何引入协程和原理分析
Nov 30 #Python
Django缓存Cache使用详解
Nov 30 #Python
You might like
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php压缩文件夹最新版
2018/07/18 PHP
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python实现windows下文件备份脚本
2018/05/27 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
Python安装whl文件过程图解
2020/02/18 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Python通过socketserver处理多个链接
2020/03/18 Python
python中如何打包用户自定义模块
2020/09/23 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
Shein英国:女性时尚网上商店
2019/04/10 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
廉政教育心得体会
2014/01/01 职场文书
民政局标准版离婚协议书
2014/12/01 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
创业计划书之餐饮
2019/09/02 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
Go语言应该什么情况使用指针
2021/07/25 Golang
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记