使用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之用Python计算
Sep 12 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
python 读入多行数据的实例
Apr 19 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
零基础小白多久能学会python
Jun 22 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
浅谈Python数学建模之线性规划
Jun 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设计模式 Template (模板模式)
2011/06/26 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
2011/10/29 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
JS交换变量的方法
2015/01/21 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
python和pyqt实现360的CLable控件
2014/02/21 Python
python之import机制详解
2014/07/03 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
写好自荐信的要点
2013/11/06 职场文书
汽修专业自荐信
2014/07/07 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
元旦标语大全
2014/10/09 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
vue实现在data里引入相对路径
2022/06/05 Vue.js