使用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 05 Python
Python下载懒人图库JavaScript特效
May 28 Python
Django与JS交互的示例代码
Aug 23 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
python groupby 函数 as_index详解
Dec 16 Python
python输入中文的实例方法
Sep 14 Python
python pip如何手动安装二进制包
Sep 30 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 Python
利用Pycharm连接服务器的全过程记录
Jul 01 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实现小型站点广告管理(修正版)
2006/10/09 PHP
转换中文日期的PHP程序
2006/10/09 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
Vue中计算属性computed的示例解读
2017/07/26 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
详解Python3的TFTP文件传输
2018/06/26 Python
使用TensorFlow实现SVM
2018/09/06 Python
python3 线性回归验证方法
2019/07/09 Python
详解python中eval函数的作用
2019/10/22 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
精伦电子Java笔试题
2013/01/16 面试题
高中自我评价范文
2014/01/27 职场文书
关于环保的建议书400字
2014/03/12 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS