使用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的Flask框架中构建Web表单的教程
Jun 04 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
pandas中DataFrame检测重复值的实现
May 26 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
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
python encode和decode的妙用
2009/09/02 Python
python基础教程之常用运算符
2014/08/29 Python
Python字符串处理函数简明总结
2015/04/13 Python
Python如何快速实现分布式任务
2017/07/06 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
python简单实例训练(21~30)
2017/11/15 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python实现贪吃蛇小游戏
2020/03/21 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
在python中求分布函数相关的包实例
2020/04/15 Python
500行python代码实现飞机大战
2020/04/24 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
普通PHP程序员笔试题
2016/01/01 面试题
请解释virtual关键字的含义
2015/06/17 面试题
环境工程专业自荐信范文
2014/03/18 职场文书
预备党员入党感想
2015/08/10 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书