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 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
Python实现读取并保存文件的类
May 11 Python
pygame实现简易飞机大战
Sep 11 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
python正则-re的用法详解
Jul 28 Python
python elasticsearch环境搭建详解
Sep 02 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php微信开发之关注事件
2018/06/14 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
用unescape反编码得出汉字示例
2014/04/24 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python中unittest用法实例
2014/09/25 Python
Python读取Excel的方法实例分析
2015/07/11 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
手工社团活动方案
2014/02/17 职场文书
大学新闻系自荐书
2014/05/31 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
计划生育诚信协议书
2014/11/02 职场文书
毕业典礼邀请函
2015/01/31 职场文书
接待员岗位职责
2015/02/13 职场文书
大学生受助感言
2015/08/01 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
Python实现滑雪小游戏
2021/09/25 Python