使用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中的CURL PycURL使用例子
Jun 01 Python
Python深入学习之内存管理
Aug 31 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
python tkinter界面居中显示的方法
Oct 11 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
Python基于Webhook实现github自动化部署
Nov 28 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函数)
2006/10/09 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
详解新手使用vue-router传参时注意事项
2019/06/06 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python数据结构之翻转链表
2017/02/25 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
python安装pil库方法及代码
2019/06/25 Python
详解Python3 pickle模块用法
2019/09/16 Python
python脚本第一行如何写
2020/08/30 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
C语言编程练习
2012/04/02 面试题
前处理班长职位说明书
2014/03/01 职场文书
家长对老师的评语
2014/04/18 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers