使用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计算N天之后日期的方法
Mar 31 Python
Python实现简单登录验证
Apr 13 Python
python中PIL安装简单教程
Apr 21 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
Python 列表的清空方式
Jan 13 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Django nginx配置实现过程详解
Sep 10 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
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
浅析is_writable的php实现
2013/06/18 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
Python找出list中最常出现元素的方法
2016/06/14 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python常用的json标准库
2019/02/19 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
家长学校培训材料
2014/08/20 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
银行贷款委托书范本
2014/10/11 职场文书
2015年质检工作总结
2015/05/04 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
活动总结书怎么写
2015/05/11 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python