使用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模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
Python是什么 Python的用处
May 26 Python
python怎么判断模块安装完成
Jun 19 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
关于python中remove的一些坑小结
Jan 04 Python
pandas提升计算效率的一些方法汇总
May 30 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python中Class类用法实例分析
2015/11/12 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
python提取xml里面的链接源码详解
2019/10/15 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
工程造价管理专业大专生求职信
2013/10/06 职场文书
会计专业推荐信
2013/10/29 职场文书
妇产医师自荐信
2014/01/29 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
保护环境建议书400字
2014/05/13 职场文书
教师求职自荐书
2014/06/14 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
volatile保证可见性及重排序方法
2022/08/05 Java/Android