使用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 相关文章推荐
详解如何利用Cython为Python代码加速
Jan 27 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
Django 迁移、操作数据库的方法
Aug 02 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
python 进程池pool使用详解
Oct 15 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
python利用opencv实现颜色检测
Feb 23 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初学者们头痛的十四个问题
2007/01/15 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php遍历目录方法小结
2015/03/10 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
三种Webpack打包方式(小结)
2018/09/19 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
毕业感言怎么写
2015/07/31 职场文书
诉讼和解协议书
2016/03/23 职场文书