使用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实现的数据结构与算法之快速排序详解
Apr 22 Python
举例详解Python中循环语句的嵌套使用
May 14 Python
Python实现的简单算术游戏实例
May 26 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
python抓取文件夹的所有文件
Feb 27 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
python日志模块logbook使用方法
Sep 19 Python
python中的RSA加密与解密实例解析
Nov 18 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Django搭建项目实战与避坑细节详解
Dec 06 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
php中__toString()方法用法示例
2016/12/07 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python pymongo模块常用操作分析
2018/09/01 Python
python实现排序算法解析
2018/09/08 Python
Python3解释器知识点总结
2019/02/19 Python
Python的缺点和劣势分析
2019/11/19 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
python statsmodel的使用
2020/12/21 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
Oracle性能调优原则
2012/05/03 面试题
个人自我评价和职业目标
2014/01/24 职场文书
个人银行贷款担保书
2014/04/01 职场文书
健康家庭事迹材料
2014/05/02 职场文书
校庆口号
2014/06/20 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
我的收音机情缘
2022/04/05 无线电
SQL语句多表联合查询的方法示例
2022/04/18 MySQL