首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Django 学习笔记之模型高级用法(上)

Django 学习笔记之模型高级用法(上)

作者头像
猴哥yuri
发布于 2018-08-16 08:41:22
发布于 2018-08-16 08:41:22
2.6K0
举报
文章被收录于专栏:极客猴极客猴

题图:by thefolkpr0ject from Instagram

前面有两篇文章简单介绍 Django 的模型,这一部分算是基础知识。我自己近期也总做了下总结,将花大概两篇的篇幅来分享下模型的一些高级用法。

如果想熟悉 Django 的用法,我认为应该一开始要熟悉一些细节用法,后面再了解 Django 的实现原理。而细节用法往往体现在一些差别用法,难以理解的知识点上。

1 复杂的字段类型

经过前面的学习,我们知道模型的字段类型一方面是指定数据库表的列名称和数据类型,另一方面决定 HTML 中的表单标签类型。

1.1 整数类型的区别

Django 的整数类型有三个,分别是 IntegerFieldBigIntegerFieldSmallIntegerField。这三个字段区别在于取值范围。IntegerField 在 Django 所有支持的数据库中,合法取值范围是 -2147483648 到 2147483647。而 BigIntegerField 是一个 64 位整数,它允许的值范围是 -9223372036854775808 到 9223372036854775807。所以在数据库迁移的时候,特别数据库中有 Sqlite 时,要更加注意数字的取值范围。SmallIntegerField 取值范围是 -32768 到 32767

1.2 自增类型的区别

AutoFiledBigAutoFiled 都是自增类型,它们都是由整数类型演化而来。AutoFiled 是一个根据实际 ID 自动增长的 IntegerField。通常不需要直接使用它,如果表中没有设置主键时,Django 将会自动添加一个自增主键。BigAutoField 其实也是一个 BigIntegerField,但它支持 ID 自动增长。所以它的取值范围不能为负数和零了。

1.3 时间类型

DateField 和 DateTimeField 中的两个重要属性 auto_nowauto_now_add 默认值都是 Flase。 设置 auto_now 或者 auto_now_add 的值为 True,间接给该字段设置了 editable=False 和 blank=True 。给参数赋值需要传递一个 datetime.date 对象。如果时间是一串字符串,则转化为 date 对象。

DateField 支持输入值的形式如下:

代码语言:javascript
AI代码解释
复制
['%Y-%m-%d',      # '2006-10-25'
 '%m/%d/%Y',      # '10/25/2006'
 '%m/%d/%y']      # '10/25/06'

DateTimeField 支持输入值的形式如下:

代码语言:javascript
AI代码解释
复制
['%b %d %Y',      # 'Oct 25 2006'
 '%b %d, %Y',     # 'Oct 25, 2006'
 '%d %b %Y',      # '25 Oct 2006'
 '%d %b, %Y',     # '25 Oct, 2006'
 '%B %d %Y',      # 'October 25 2006'
 '%B %d, %Y',     # 'October 25, 2006'
 '%d %B %Y',      # '25 October 2006'
 '%d %B, %Y']     # '25 October, 2006'

1.4 FilePathField

该字段是用于保存文件路径信息的。默认最大长度为 100,当可通过 max_length 参数自定义。它包含几个重要的参数:

path:必传参数。记录目录或者文件的绝对路径。例如:/home/monkey

match:可选参数,它是一个正则表达式,主要用于匹配过滤出文件名。

recursive:可选参数,表示是否包含子目录。默认值为 Flase。

allow_files:可选参数,表示是否将文件名包括在内,默认值为 True。

allow_folders:可选参数,表示是否将目录名包括在内默认值为 Flase。

Django 规定 allow_files 和 allow_folders 两者之间必须有一个值为 True。

1.5 FileField

上传文件字段,常见于表单中。一般而言,文件都是保存在服务器的硬盘中。因此,该字段在数据库中其实是一个字符串类型,默认最大长度100,可以通过max_length参数自定义。

FileField 有两个重要的可选参数:upload_tostorage

1) upload_to

upload_to 是指定文件上传的目录。用法如下:

代码语言:javascript
AI代码解释
复制
class MyModel(models.Model):
    # 文件上传到 MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # 或者
    # 文件上传到 MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

其中 MEDIA_ROOT 是在 settings.py 中设置,表示上传文件的根目录。另外还需要设置 MEDIA_URL, 它表示上传文件对外能访问的 url 地址。

2)Storage

Storage 是一个文件操作对象。它提供 size(path)、open(path).read()、delete(path)、exists(path)等方法来操作文件。

1.6 ImageField

保存图像文件的字段。ImageField 用法跟 FileField 类似。除了需要在 seeting.py 中增加相关配置,还都拥有共同的 upload_to 字段选项。

它还有额外的可选参数:一个是 height_field,表示保存图片的高度。 另一个是 width_field,表示保存图片的宽度。

2 关系字段

之前文章讲了三种关系字段的类型、定义、作用。今天讲下其中的一些字段选项。

2.1 ForeignKey

1) on_delete

在 Django 2.0 中,设置外键时需要添加一个 on_delete选项。外键本身涉及到两个表的数据,况且外键在数据库中是有约束行为。所以 on_delete 参数是 Django 模拟 SQL 约束的行为。

on_delete 有几个可选值:

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。

PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出 ProtectedError 错误。

SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是`blank=True, null=True`,定义该字段的时候,允许为空。

SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。

SET(): 自定义对应的实体的值。

2)limit_choices_to

该参数用于限制外键所能关联的对象,只能用于 Django 的 ModelForm(Django的表单模块)和 admin 后台,对其它场合无限制功能。该值接受是一个字典、返回一个字典的函数

3) db_constraint

默认情况下,这个参数被设为 True,表示遵循数据库约束。如果设为 False,那么将无法保证数据的完整性和合法性。

4) related_name

用于关联对象反向引用模型的名称。主要用于反向查询,即外键源模型实例通过管理器返回第一个模型的所有实例。

默认情况下,这个管理器的名字为 foo_set,其中 foo 是源模型名字的小写。例如:

代码语言:javascript
AI代码解释
复制
# 在终端下使用 Django
>>>b = Book.objects.get(id=1)
# 其中 entry_set 为默认的 related_name
>>>b.entry_set.all() 
>>>b.entry_set.filter(headline__contains='天龙八部')
>>>b.entry_set.count()

如果我们设置 related_name='novels',那么上面的代码将变为:

代码语言:javascript
AI代码解释
复制
# 在终端下使用 Django
>>>b = Book.objects.get(id=1)
# 其中 entry_set 为默认的 related_name
>>>b.novels.all() 
>>>b.novels.filter(headline__contains='天龙八部')
>>>b.novels.count()

5)related_query_name

反向查询的关系查询集名称。用于从目标模型反向过滤模型对象的名称。具体用法如下:

代码语言:javascript
AI代码解释
复制
class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)

# 现在可以使用 tag作为查询名
Article.objects.filter(tag__name="important")

3 字段选项

字段选项是给每个 Field 指定一些属性。

db_column: 指定当前数据库表中该字段的列名。如果没有指定,Django 默认将 Field 名作为字段名。

db_index: 如果赋值为 True, 将会为这个字段创建数据库索引。

db_tablespace:如果该字段已经设置了索引,db_tablespace 用于指定字段索引的数据库表空间的名字。另外还需要看使用的数据库支不支持表空间。如果不支持,该参数设置没有效果。

editable:设置该字段是否能被编辑,默认是 True。如果设为 False , 这个字段将不会出现在 admin 或者其他 ModelForm 中。 同时也会跳过 模型验证 。

error_messages:用于自定义错误提示信息。参数接受的是字典类型的值。字典的 key 可以是 null, blank, invalid, invalid_choice, unique, 和 unique_for_dat 其中的一个。

help_text:用于前端页面上显示提示信息。要确保页面不存在 XXS 漏洞,需要使用 django.utils.html.escape() 对内容进行转义。

unique_for_date:设置为 DateField 或者 DateTimeField 字段的名字,表示要求该字段对于相应的日期字段值是唯一的。例如,字段 title 设置了 unique_for_date="pub_date" ,那么Django将不会允许在同一 pub_date 的两条记录的 title 相同。

unique_for_month:用法跟 unique_for_date 类似。

unique_for_year:用法跟 unique_for_date 类似。

verbose_name:为字段设置别名。对于每一个字段类型,除了 ForeignKey、ManyToManyField和 OneToOneField 这三个特殊的关系类型,其第一可选位置参数都是 verbose_name。如果用户没有定义该选项, Django会自动将自动创建,内容是该字段属性名中的下划线转换为空格的结果。

比如这个例子中描述名是 person's first name:

代码语言:javascript
AI代码解释
复制
first_name = models.CharField("person's first name", max_length=30)

而没有主动设置时,则是 first name:

代码语言:javascript
AI代码解释
复制
first_name = models.CharField(max_length=30)

对于外键、多对多和一对一字字段,由于第一个参数需要用来指定关联的模型。因此必须用关键字参数 verbose_name 来明确指定。如下:

代码语言:javascript
AI代码解释
复制
poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

另外 verbose_name 不用大写首字母,在必要的时候 Django 会自动大写首字母。

validators:该字段将要运行的一个验证器的列表。例如 RegexValidator、EmailValidator。

4 写在最后

我新建 Python Web 学习交流 QQ 群,群号:701534112。或者长按以下二维码加群。欢迎大家加群,一起交流,一起学习。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客猴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django模型开发全解析:字段、元数据与继承的实战指南
在Django开发中,模型(Model)是连接业务逻辑与数据库的核心桥梁。它不仅定义数据结构,还通过元数据控制数据库行为,通过继承实现代码复用。本文将以实战视角,结合具体场景,拆解Django模型开发的三大核心模块:字段类型选择、元数据配置与继承模式应用。
富贵软件
2025/08/29
2310
Django模型开发全解析:字段、元数据与继承的实战指南
Django模型开发全解析:字段、元数据与继承的实战指南
在Django开发中,模型(Model)是连接业务逻辑与数据库的核心桥梁。它不仅定义数据结构,还通过元数据控制数据库行为,通过继承实现代码复用。本文将以实战视角,结合具体场景,拆解Django模型开发的三大核心模块:字段类型选择、元数据配置与继承模式应用。
富贵软件
2025/08/08
2670
Django REST framework+Vue 打造生鲜超市(二)
三、Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip install djangorestframework pip install -i https://pypi.douban.com/simple django==2.0.2 pip install markdown pip install django-filter pip install pillow
zhang_derek
2018/04/11
2.4K0
Django REST framework+Vue 打造生鲜超市(二)
Django+xadmin打造在线教育平台(一)
代码 github下载  一、前言 代码下载:  开发环境:     python:  3.6.4     Django: 2.0.2 后台管理:xadmin 1.1.项目介绍 系统概括: 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。 导航栏: 公开课,授课讲师,授课机构,全局搜索。 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。 点击课程–> 课程详情页中对课程进行收藏,
zhang_derek
2018/04/11
6.1K1
Django+xadmin打造在线教育平台(一)
Django开发在线教育平台--学习整理(一)
首先,打开cmd,cd到存放django项目的文件夹,创建一个新工程(也可以用虚拟环境virtualenv):
SimonDM
2018/05/09
3.3K4
Django开发在线教育平台--学习整理(一)
【Python全栈100天学习笔记】Day41 Django深入理解框架
在上一个章节中,我们提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图”的解耦合。所谓“模型”说得更直白一些就是数据(的表示),所以通常也被称作“数据模型”。在实际的项目中,数据模型通常通过数据库实现持久化操作,而关系型数据库在过去和当下都是持久化的首选方案,下面我们以MySQL为例来说明如何使用关系型数据库来实现持久化操作。
天道Vax的时间宝藏
2022/04/02
3K0
【Python全栈100天学习笔记】Day41 Django深入理解框架
Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
  新版的pycharm很贴心的让每一个新的项目,都自动会在一个虚拟环境中,放心的新建项目就可以了,不用考虑虚拟环境的事儿了
玩蛇的胖纸
2018/10/10
2.1K0
Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
Django 系列博客(十三)
int 自增列,必须填入参数 primary_key=True。当 model 中如果没有自增列,则会自动创建一个列名为 id 的列。
py3study
2020/01/22
1.7K0
零基础使用Django2.0.1打造在线教育网站(八):数据库字段的定义(下)
努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/08/21
1K0
Django进阶知识
django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。
超蛋lhy
2018/08/31
4.1K0
Django模型的Field Types总结
Field Types 常用参数: null 如果设置为 True , Django 存放一个 NULL 到数据库字段。默认为 False。 blank 如果设置为 True , 此 field 允许为 blank (空白),默认为 False。 choices 一个2元元组的元组或者列表,如果执行 choices , Django 的 admin 就会使用 选择框而不是标准的 text 框填写这个 field。
Ewdager
2020/07/14
1.4K0
Django ORM (一) 创建数据库
创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上创建数据库结构 from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.Ch
py3study
2020/01/16
2K0
Django之ORM字段和参数
字段 常用字段 ---- AutoField                                                                                                                                                                                                                                         
人生不如戏
2018/04/12
3.2K0
django admin list_filter 显示外键字段
models.py class Node(models.Model): """ 节点表 """ name = models.CharField(max_length=128, unique=True, verbose_name="节点名称") # SlugField 是一个新闻术语(通常叫做短标题)。一个slug只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在地址栏的URL里的。 # 像CharField一样,你可以指定max_
卓越笔记
2023/02/18
1.5K0
Django项目知识点(三)
模型是数据唯一而且准确的信息来源。它包含正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。
润森
2019/09/20
2.4K0
Django项目知识点(三)
【云+社区年度正文】Django从入门到精通No.2----模型
学过orm系统自然之道模型的重要性,很多web站点都需要与数据库交互,这个时候模型的设计就显得尤为重要,一个好的模型会使得项目方便管理并且易于维护,比如我们学过的flask,里面的sqlalchemy就是这样一个优秀的模块,通过它可以快速和数据库建立通道,从而使得web编程更为高效,本文主要讲解django的模型。
Python进阶者
2020/11/27
2.8K0
【云+社区年度正文】Django从入门到精通No.2----模型
Django model 层之Models与Mysql数据库小结
下载地址:https://www.python.org/downloads/release/python-340/
授客
2020/07/22
2.9K0
06.Django基础五之django模型层(二)多表操作
    一对一、多对一、多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束。
changxin7
2019/09/29
3.2K0
Django中ORM介绍和字段及其参数
ORM介绍 ORM概念   对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。   简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。   ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 ORM的由来   字母‘O’起源于“对象”(Object),'R'代表“关系”(Relational)。   几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业
新人小试
2018/04/12
3.7K0
Django中ORM介绍和字段及其参数
Django ORM 知识概要
注: 本文知识点是根据自己的项目经验及慕课网的教学视频整理所得, 如需转载请注明出处:https://www.cnblogs.com/zhuchenglin/p/10223596.html
lin_zone
2019/02/22
2.3K0
推荐阅读
相关推荐
Django模型开发全解析:字段、元数据与继承的实战指南
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场