使用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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
python中常用的各种数据库操作模块和连接实例
May 29 Python
Python 常用的安装Module方式汇总
May 06 Python
微信跳一跳自动运行python脚本
Jan 08 Python
Python字典及字典基本操作方法详解
Jan 30 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
php数组遍历类与用法示例
2019/05/24 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
python实现识别相似图片小结
2016/02/22 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python求最大连续子数组的和
2018/07/07 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
客户表扬信范文
2014/01/10 职场文书
担保书格式及范文
2014/04/01 职场文书
教师师德演讲稿
2014/05/06 职场文书
高中运动会广播稿
2014/09/16 职场文书
重温入党誓词主持词
2015/06/29 职场文书
高一数学教学反思
2016/02/18 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
Django如何与Ajax交互
2021/04/29 Python
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis