前置——sqlite3 model 常用字段
字符型字段
topic=models.CharField(max_length=) 需要传入参数,设置字符串的最长长度
email=models.EmailTield()#电子邮箱字段,在CharField基础上,增加了邮箱的正则验证
a=models.SlugField()#仅含有字母下划线数字和连字符的字符串
url=models.URLField()#url字段,默认长度200字符
field=models.FieldPathField()#文件路径字段存储文件路径
text=models.TextField()存储大量文本
布尔类型字段:
bool=models.BooleanField(null=)#传参值为设置是否可空
日期字符串:
datetime=models.DateTimeField()#日期时间字段可以传入两个参数值。auto_now=True每次更新对象时,都会更新此字段。auto_now_add=True为创建对象时保存的时间
date=models.DateTimeField()#可选参数与上一个相同
time=models.TimeField()#可选参数与上一个相同
during=models.DurationField()储存时间段的字段
文件类型字段:
field=models.FileField()#上传文件字段,upload_to指定上传文件的路径字段,storage参数用于指定使用的存储引擎
image=models.ImageField()#在FileField的基础上添加图片的校验
key=models.ForeignKey()#多对一关系,与其他数据相关联需要传递参数on_delete参数指明当关联对象被删除,该对象的行为
相关字段的参数:
null#此参数设置此字段是否可空
blank#此参数为true时,此字段输入框可以留空
choices#此参数必须接收一个元组或者列表,在填写时,可供选择
default#此参数设置默认值
unique#此参数如果为true则会保持该字段数据唯一
verbose_name#设置字段名称,可以在admin中显示更易懂的文字
重构默认的User
AbstractUser类用于拓展Django自带的User类字段,而不能修改其已有字段。
username:用户名
email: 电子邮件
password:密码
first_name:名
last_name:姓
is_active: 是否为活跃用户。默认是True
is_staff: 是否为员工。默认是False
is_superuser: 是否为管理员。默认是False
date_joined: 加入日期。系统自动生成。
继承AbstracUser类自定义User有一个不好的地方,就是我们没有办法改变其已有的字段,比如first_name和last_name我们并不需要,这个时候就可以继承AbstractBaseUser和PermissionsMixin类完全重写User模型
AbstractBaseUser
和PermissionsMixin
分别定义了用户类最基本的字段以及最基本的权限字段,可以说这两个类是Django中user类最核心的部分了,缩无可缩。
查看AbstractBaseUser的源代码,你会发现这个类中定义了如下几个字段:
password,密码
last_login,最后登录时间
而在PermissionsMixin中,定义了如下几个字段:
is_super,是否是超级管理员
groups,所属用户组
user_permissions,用户权限组
由此可见,使用AbstractBaseUser和PermissionsMixin自定义用户类的自由度是最高的,只需要继承5个字段即可,其他的可以完全由我们自定义。
下面提供一个代码示例:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
def _create_user(self, username, password=None, **kwargs):
if not username:
raise ValueError('The given username must be set')
user = self.model(username=username, **kwargs)
user.set_password(password)
user.save()
return user
def create_user(self, username, password=None, **kwargs):
kwargs['is_superuser'] = False
kwargs['is_staff'] = False
return self._create_user(username, password, **kwargs)
def create_superuser(self, username, password=None, **kwargs):
kwargs['is_superuser'] = True
kwargs['is_staff'] = True
return self._create_user(username, password, **kwargs)
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=20, verbose_name="用户名", unique=True)
photo = models.ImageField(upload_to="image", null=True, blank=True, verbose_name="头像")
is_active = models.BooleanField(default=True, verbose_name="是否有效")
is_staff = models.BooleanField(default=False, verbose_name="是否是管理员")
is_superuser = models.BooleanField(default=False, verbose_name="是否是超级管理员")
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'username'
object = UserManager()
def __str__(self):
return self.username
class Meta:
verbose_name = "用户"
verbose_name_plural = verbose_name
我们除了定义相关字段外,还进行了字段指定行为和一个对象指定行为:
USERNAME_FIELD = "username"
objects = UserManager()
其中USERNAME_FIELD = "username"
表示该model类中用哪个字段表示用户名。这个字段指定行为是必要操作,用于Django验证用户名密码以及后台登录等操作。
objects = UserManager()
是一种对象指定行为,主要目的是自定义在使用django-admin创建用户的时候Django的处理逻辑,其中UserManager
是自定义的一个管理类。