Django 模型(一)
版权声明:本博客来自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途。
欢迎访问路飞学城官网:https://www.luffycity.com/
本节重点
- ORM简介
- 模型(Model)
- 单表实例
- ORM常用字段及参数
1. ORM简介
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。
1.1 ORM概念
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
1.2 ORM由来
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。
几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。
按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。
1.3 ORM解析过程
- ORM 会将 Python 代码转成为 SQL 语句。
- SQL 语句通过 pymysql 传送到数据库服务端。
- 在数据库中执行 SQL 语句并将结果返回。
1.4 ORM优势
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。让软件开发人员专注于业务逻辑的处理,提高了开发效率。
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。不同数据库可以平滑切换。
1.5 ORM劣势
ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
长期写 ORM 代码,会降低编写 SQL 语句的能力。
1.6 ORM总结
ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。
但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。
但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。
2 . 模型(Model)
在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。
通常,一个模型(model)映射到一个数据库表。
基本情况:
- 每个模型都是一个Python类,它是django.db.models.Model的子类。
- 模型的每个属性都代表一个数据库字段。
- 综上所述,Django为您提供了一个自动生成的数据库访问API。
3. 单表实例
3.1 数据库配置
创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:
create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8
例如我们创建一个名为 runoob 数据库,编码指定为 utf8:
create database runoob default charset=utf8;
在Django项目的settings.py
文件中找到 DATABASES 配置项,配置数据库连接信息:
# settings.py 文件代码
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
如果你使用了 Python2.x 版本这里添加了中文注释,所以你需要在settings.py
文件头部添加 # -*- coding: UTF-8 -*-。
上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。
在Django项目的__init__.py
文件中写如下代码,告诉 Django 使用 pymysql 模块连接 mysql 数据库:
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
3.2 建立模型
- 创建APP
Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 app01 的 app:
django-admin.py startapp app01
- 修改配置文件
接下来在 settings.py 中找到INSTALLED_APPS这一项,修改如下:
# settings.py 文件
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01', # 添加此项
)
- 创建模型
在项目中的 models.py 中添加以下类:
# models.py
class Book(models.Model):
id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
title = models.CharField(max_length=32) # 书籍名称
price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
publish = models.CharField(max_length=32) # 出版社名称
pub_date = models.DateField() # 出版时间
以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(id、title、price、pulish、pub_date),数据类型则由CharField(相当于varchar)、DecimalField(相当于numeric)、DateField(相当于datetime), max_length 参数限定长度。
- 创建表结构
通过两条数据库迁移命令即可在指定的数据库中创建表 ,在命令行中运行:
$ python3 manage.py makemigrations # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate # 创建表结构
看到几行 “Creating table…” 的字样,你的数据表就创建好了。
Creating tables ...
……
Creating table TestModel_test #我们自定义的表
……
表名组成结构为:应用名_类名(如:TestModel_test)。
这时数据库 runoob 就会创建一个 app01_book 的表。
- 注意
- 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时。
- 尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。
- 如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
- 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值得注意的是,Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句。
- Django支持MySQL5.5及更高版本。
常见报错信息:
如果执行以上命令时会出现如下报错信息:
原因是 MySQLclient 目前只支持到 Python3.4,因此如果使用的更高版本的 python,需要修改如下:
通过报错信息的文件路径找到 …site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的 base.py 文件,把这两行代码注释掉(代码在文件开头部分):
if version < (1, 3, 13): raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
一般点报错的代码文件路径信息,会自动跳转到报错文件中行数,此时我们在报错的代码行数注释掉。
如果出现以下报错信息:
我们点报错的代码文件路径,跳转到报错文件中行数,此时我们在报错的代码行数之前加上:
query = query.encode()
- 目录结构
接下来我们在app01 项目里添加 views.py 文件,app01 项目目录结构:
app01 |-- app01 | |-- __init__.py | |-- __pycache__ | |-- asgi.py | |-- migrations | |-- models.py | |-- settings.py | |-- urls.py | |-- views.py | `-- wsgi.py
- 打印SQL语句
如果想打印orm转换过程中的sql,需要在settings中进行如下配置:
# settings.py 文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
3.4 数据库操作
配置路由规则,修改 urls.py:
# urls.py: 文件代码:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('add_book/', views.add_book),
]
3.4.1 添加数据
方式一: 模型类实例化对象
需从 app 目录引入 models.py 文件:
并且实例化对象后要执行 对象.save() 才能在数据库中新增成功。
# app01/views.py: 文件代码
from django.shortcuts import render,HttpResponse
from app01 import models # 引入models.py 文件
def add_book(request):
book = models.Book(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8")
book.save()
return HttpResponse("<p>数据添加成功!</p>")
方式二: 通过 ORM 提供的 objects 提供的方法 create 来实现(推荐)
# app01/views.py: 文件代码
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
books = models.Book.objects.create(title="如来神掌",price=200,publish="功夫出版社",pub_date="2010-10-10")
print(books, type(books)) # Book object (18)
return HttpResponse("<p>数据添加成功!</p>")
3.4.2 查询数据
-
查询API
-
all()
使用 all() 方法来查询所有内容。
返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.all() print(books,type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。 return HttpResponse("<p>查找成功!</p>")
-
filter()
filter() 方法用于查询符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。
pk=3 的意思是主键 primary key=3,相当于 id=3。
因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
books = models.Book.objects.filter(publish='菜鸟出版社', price=300)
-
exclude()
exclude() 方法用于查询不符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是不满足条件的模型类的对象,可用索引下标取出模型类的对象。
books = models.Book.objects.exclude(publish='菜鸟出版社', price=300)
-
get()
get() 方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.get(pk=5) books = models.Book.objects.get(pk=18) # 报错,没有符合条件的对象 books = models.Book.objects.get(price=200) # 报错,符合条件的对象超过一个 print(books, type(books)) # 模型类的对象 return HttpResponse("<p>查找成功!</p>")
-
order_by()
order_by() 方法用于对查询结果进行排序。
返回的是 QuerySet类型数据,类似于list,里面放的是排序后的模型类的对象,可用索引下标取出模型类的对象。
注意:
- a、参数的字段名要加引号。
- b、降序为在字段前面加个负号 -。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.order_by("price") # 查询所有,按照价格升序排列 books = models.Book.objects.order_by("-price") # 查询所有,按照价格降序排列 return HttpResponse("<p>查找成功!</p>")
-
reverse()
reverse() 方法用于对查询结果进行反转。
返回的是 QuerySe t类型数据,类似于 list,里面放的是反转后的模型类的对象,可用索引下标取出模型类的对象。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): # 按照价格升序排列:降序再反转 books = models.Book.objects.order_by("-price").reverse() return HttpResponse("<p>查找成功!</p>")
-
count()
count() 方法用于查询数据的数量返回的数据是整数。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.count() # 查询所有数据的数量 books = models.Book.objects.filter(price=200).count() # 查询符合条件数据的数量 return HttpResponse("<p>查找成功!</p>")
-
first()
first() 方法返回第一条数据返回的数据是模型类的对象也可以用索引下标 [0]。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.first() # 返回所有数据的第一条数据 return HttpResponse("<p>查找成功!</p>")
-
last()
last() 方法返回最后一条数据返回的数据是模型类的对象不能用索引下标 [-1],ORM 没有逆序索引。
books = models.Book.objects.last() # 返回所有数据的最后一条数据
-
exists()
exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。
返回的数据类型是布尔,有为 true,没有为 false。
注意: 判断的数据类型只能为 QuerySet 类型数据,不能为整型和模型类的对象。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): books = models.Book.objects.exists() # 报错,判断的数据类型只能为QuerySet类型数据,不能为整型 books = models.Book.objects.count().exists() # 报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象 books = models.Book.objects.first().exists() return HttpResponse("<p>查找成功!</p>")
-
values()
values() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个可迭代的字典序列,字典里的键是字段,值是数据。
注意:
- 参数的字段名要加引号
- 想要字段名和数据用 values
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): # 查询所有的id字段和price字段的数据 books = models.Book.objects.values("pk","price") print(books[0]["price"],type(books)) # 得到的是第一条记录的price字段的数据 return HttpResponse("<p>查找成功!</p>")
-
values_list()
values_list() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个个元组,元组里放的是查询字段对应的数据。
注意:
- 参数的字段名要加引号
- 只想要数据用 values_list
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): # 查询所有的price字段和publish字段的数据 books = models.Book.objects.values_list("price","publish") print(books) print(books[0][0],type(books)) # 得到的是第一条记录的price字段的数据 return HttpResponse("<p>查找成功!</p>")
-
distinct()
distinct() 方法用于对数据进行去重。
返回的是 QuerySet 类型数据。
注意:
- 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
- distinct() 一般是联合 values 或者 values_list 使用。
# app01/views.py: 文件代码 from django.shortcuts import render,HttpResponse from app01 import models def add_book(request): # 查询一共有多少个出版社 books = models.Book.objects.values_list("publish").distinct() # 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。 books = models.Book.objects.distinct() return HttpResponse("<p>查找成功!</p>")
-
-
filter()方法基于双下划线的模糊查询
filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号。
-
__in等于号,用于读取区间,= 号后面为列表
# 查询价格为200或者300的数据 books = models.Book.objects.filter(price__in=[100,200,300])
-
__gt 大于号 ,= 号后面为数字
# 查询价格大于200的数据 books = models.Book.objects.filter(price__gt=200)
-
__gte 大于等于,= 号后面为数字
# 查询价格大于等于200的数据 books = models.Book.objects.filter(price__gte=200)
-
__lt 小于,= 号后面为数字
# 查询价格小于300的数据 books=models.Book.objects.filter(price__lt=300)
-
__lte 小于等于,= 号后面为数字
# 查询价格小于等于300的数据 books=models.Book.objects.filter(price__lte=300)
-
__range 在 … 之间,左闭右闭区间,= 号后面为两个元素的列表
# 查询价格为200-300的数据 books = models.Book.objects.filter(price__range=[200,300])
-
__contains 包含,= 号后面为字符串
# 查询名称包含“菜”的数据 books=models.Book.objects.filter(title__contains="菜")
-
__icontains 不区分大小写的包含,= 号后面为字符串
# 查询名称包含“python”的数据,且不区分大小写 books=models.Book.objects.filter(title__icontains="python") # 不区分大小写
-
__startswith 以指定字符开头,= 号后面为字符串
# 查询名称以“菜”开头的数据 books=models.Book.objects.filter(title__startswith="菜")
-
__endswith 以指定字符结尾,= 号后面为字符串
# 查询名称以“菜”结尾的数据 books=models.Book.objects.filter(title__endswith="教程")
-
__year 是 DateField 数据类型的年份,= 号后面为数字
# 查询出版年份为2008年的数据 books=models.Book.objects.filter(pub_date__year=2008)
-
__month 是DateField 数据类型的月份,= 号后面为数字
# 查询出版月份为10月的数据 books=models.Book.objects.filter(pub_date__month=10)
-
__day 是DateField 数据类型的天数,= 号后面为数字
# 查询1号出版的数据 books=models.Book.objects.filter(pub_date__day=01)
-
3.4.3 更新数据
方式一:
模型类的对象.属性 = 更改的属性值 模型类的对象.save()
返回值: 编辑的模型类的对象。
# app01/views.py: 文件代码
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
books = models.Book.objects.filter(pk=7).first()
books.price = 400
books.save()
return HttpResponse(books)
方式二: QuerySet 类型数据.update(字段名=更改的数据)(推荐)
返回值: 整数,受影响的行数
# app01/views.py: 文件代码
from django.shortcuts import render,HttpResponse
from app01 import models
def add_book(request):
books = models.Book.objects.filter(pk__in=[7,8]).update(price=888)
return HttpResponse(books)
3.4.4 删除数据
方式一: 使用模型类的 对象.delete()。
返回值: 元组,第一个元素为受影响的行数。
books=models.Book.objects.filter(pk=8).first().delete()
方式二:使用 QuerySet 类型数据.delete()(推荐)
返回值: 元组,第一个元素为受影响的行数。
books=models.Book.objects.filter(pk__in=[1,2]).delete()
4. ORM常用字段及参数
4.1常用字段
- AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
- IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。
- CharField
字符类型,必须提供max_length参数, max_length表示字符长度。
- DateField
日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
- DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
字段合集(争取记忆):
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1, 开启此功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
ORM字段与数据库实际字段的对应关系:
对应关系: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)',
4.2 字段参数
- null
用于表示某个字段可以为空。
如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False。
- blank
如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
- default
为该字段设置默认值。
- primary_key
如果为True,那么这个字段就是模型的主键。
如果你没有指定任何一个字段的primary_key=True,Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,否则没必要设置任何一个字段的primary_key=True。
- unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
- choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。
如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
- db_index
如果db_index=True 则代表着为此字段设置数据库索引。
4.3 时间字段独有
DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性。
- auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
- auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。