使用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 pass 语句使用示例
Mar 11 Python
python变量不能以数字打头详解
Jul 06 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
设置python3为默认python的方法
Oct 31 Python
python实现感知器算法(批处理)
Jan 18 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
pytorch使用horovod多gpu训练的实现
Sep 09 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
python asyncio 协程库的使用
Jan 21 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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 禁止页面缓存输出
2009/01/07 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
一个简单的node.js界面实现方法
2018/06/01 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
详解python做UI界面的方法
2019/02/27 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
浅析python标准库中的glob
2020/03/13 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
电厂职工自我鉴定
2014/02/20 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
值班管理制度范本
2015/08/06 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫