Python Django模型详解


Posted in Python onOctober 05, 2021

Django模型

Django的模型定义在models.py文件中。模型是MVT中的M,也相当于MVC中的M。

在Django中,模型必须继承自Model类。例如:

from django.db import models
# Create your models here.
class BookInfo(models.Model):       # 一个模型类就会对应生成数据库中的一张表
    """书籍模型"""  
    name = models.CharField(max_length=128, verbose_name='名称')        # 类的属性就是数据表中的字段。
    pub_date = models.DateField(verbose_name='发布日期',null=True)
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:     # class Meta是固定写法
        db_table = 'bookinfo'      # 指明数据库表名
        verbose_name = '图书'       # 在admin站点中显示的名称

注意

1.模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名,一般我们会通过db_table指明数据库表名。

2.django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id,也可以使用pk,意为primary key.

3.字段名称中不能出现双下划线,因为这是Django的查询语法之一。

自Django3.2后,可以在settings.py中配置DEFAULT_AUTO_FIELD参数来设置主键的数据类型,默认是DEFAULT_AUTO_FIELD = ‘django.db.models.BigAutoField',在Django3.2之前,默认生成的主键数据类型是AutoField.

下面是Django中常用的字段类型的详情

字段类型

类型 说明
BigAutoField 自动增长的BigIntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField 字符串,参数max_length表示最大字符个数
TextField 大文本字段,一般超过4000个字符时使用
IntegerField 整数
DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField 浮点数
DateField 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField 时间,参数同DateField
DateTimeField 日期时间,参数同DateField
FileField 上传文件字段
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片
   

下面是字段类型中的参数

字段类型的参数

参数 说明
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False
default 为字段指定默认值
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False
choices 该参数是从一系列的二元组中提供选项

注意

1.CharField字段必须要指定参数max_length

2.还可以为字段指定参数verbose_name,这个参数主要是用来在admin管理页面使用,其实是和本地化有关的。例如可以在上面的name字段指定参数verbose_name=“书籍名称”,那么在admin管理页面就会看到书籍名称。

3.null参数是数据库层面的,设置null=True之后,表示数据库的该字段可以为空;blank参数是表单层面(HTML),blank=True之后,表示表单填写该字段的时候可以不填。

外键

外键这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的外键约束。在这里只是简单的介绍一下。下面是另外一个模型,和前面的BookInfo模型通过外键关联起来。

class PeopleInfo(models.Model):
    """人员模型"""
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'
下面重点来说一下choices这个参数和models.ForeignKey。
choices参数就是从我们定义的二元组(GENDER_CHOICES)中获取值。二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_FOO_display() 方法。例如:获取上面的性别信息,可以使用get_gender_display()方法。
外键:通过使用models.ForeignKey来设置外键,ForeignKey的第一个参数是要关联的模型类名,第二个参数是on_delete。它的常用值可以如下:
CASCADE级联,删除主表数据时连通一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法
DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

注意:我们在数据库中,设置外键的时候需要制定另一张表中关联的字段,但是在Django里并没有指定。这是因为Django会默认指定另外一张表的id作为关联字段。如下图所示:

Python Django模型详解

可以看到peopleinfo这张表中的外键名称是book_id

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Python 相关文章推荐
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
Flask框架配置与调试操作示例
Jul 23 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Python selenium的基本使用方法分析
Dec 21 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Python 阶乘详解
Oct 05 #Python
Python 实现Mac 屏幕截图详解
基于Python和openCV实现图像的全景拼接详细步骤
C3 线性化算法与 MRO之Python中的多继承
Python编程super应用场景及示例解析
Python编程源码报错解决方法总结经验分享
Oct 05 #Python
Python编程根据字典列表相同键的值进行合并
Oct 05 #Python
You might like
PHP 危险函数全解析
2009/09/09 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
机器学习python实战之手写数字识别
2017/11/01 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
Python基本socket通信控制操作示例
2019/01/30 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
python区分不同数据类型的方法
2019/10/14 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
大学自主招生推荐信
2014/05/10 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
采购员岗位职责
2015/02/03 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL