使用django自带的user做外键的方法

作者:汤圆儿2019 时间:2023-04-16 06:54:36 

一、使用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

来源:https://blog.csdn.net/weixin_38851970/article/details/107487110

标签:django,user,外键
0
投稿

猜你喜欢

  • 用js+cookie记录滚动条位置

    2024-06-05 09:11:02
  • golang copy函数使用的坑

    2023-07-09 19:53:44
  • DreamweaverMX2004技巧两则

    2010-09-05 21:10:00
  • pytorch Dropout过拟合的操作

    2023-11-26 16:12:18
  • Javascript 常见的高阶函数详情

    2024-04-18 09:30:22
  • 也谈用户体验

    2009-07-15 12:56:00
  • 用python画圣诞树三种代码示例介绍

    2023-03-24 08:15:01
  • 艺术和设计之间的差别

    2010-11-17 19:28:00
  • Sql Server表死锁的解决方法分享

    2011-09-01 19:08:00
  • python批量读取txt文件为DataFrame的方法

    2021-09-29 12:04:21
  • python脚本实现统计日志文件中的ip访问次数代码分享

    2021-03-17 08:40:08
  • Django 忘记管理员或忘记管理员密码 重设登录密码的方法

    2021-02-14 09:40:46
  • python如何为list实现find方法

    2022-01-14 09:15:56
  • [设计]DREAMWEAVER 问题集锦

    2010-09-02 12:31:00
  • 实例讲解如何配置MySQL数据库主从复制

    2008-12-17 15:33:00
  • Python实战之能监控文件变化的神器—看门狗

    2022-01-05 22:01:28
  • pycharm 如何取消连按两下shift出现的全局搜索

    2023-08-24 17:44:12
  • vue获取data数据改变前后的值方法

    2024-04-30 10:35:10
  • 利用JavaScript实现防抖节流函数的示例代码

    2024-05-11 09:31:55
  • 讲解使用SQL Server升级顾问的详细步骤

    2009-01-04 14:14:00
  • asp之家 网络编程 m.aspxhome.com