一、概要
模型是你的数据的唯一的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。
- 每个模型都是
django.db.models.Model
的一个Python 子类。- 模型的每个属性都表示为数据库中的一个字段。
- 通过所有这一切,Django为你提供一个自动生成的数据库访问API
模型包括
- 字段、
- 字段类型、
- 字段选项、
- 元信息等组成
二、字段
1、说明
对于一个模型来说,最重要的和不可或缺的是列出该模型在数据库中定义的字段。字段由fields类属性指定。要注意选择的字段名称不要和 models API 冲突,比如
clean
、save
或者delete
。
2、模型
- 示例代码
from django.db import models class UserInfo(models.Model): # 自定义主键 uid = models.AutoField(primary_key=True) # 用户名 username = models.CharField(max_length=64) password = models.CharField(max_length=32) SEX_CHOICES = ( (u'1', u'男'), (u'2', u'女'), ) sex = models.CharField(max_length=1, choices=SEX_CHOICES) age = models.IntegerField() create_date = models.DateTimeField(auto_now_add=True)
3、SQL语句
- 示例代码
CREATE TABLE `hello_user` ( `uid` int(11) PRIMARY KEY AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `sex` varchar(1) NOT NULL, `age` int(11) NOT NULL, `create_date` datetime(6) NOT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4、数据库表
-
示例图
三、字段类型
模型中的每个字段都是 [
Field
]子类的某个实例。 Django根据字段的类型确定以下信息:
- 列类型,它告知数据库要存储哪种数据(例如:
INTEGER
,VARCHAR
,DATE,TEXT)。- 渲染表单时使用的默认HTML(例如,
<input type="text">
,<select>
)。- 最低限度的验证需求,它被用在 Django 管理站点和自动生成的表单中。
1、常用类型
1、IntegerField
- 类
IntegerField( **options ) - 说明
一个整数。来自-2147483648到的值
2147483647`所支持的数据库都是安全的
注意 在1.10的版本后不要使用 max_length,框架会自动忽略该选项 - 示例代码
class UserInfo(models.Model): # 年龄 age = models.IntegerField()
2、AutoField(常用)
- 类
AutoField(primary_key=False [, **options]) - 说明
自动递增主键,如果没有的话,框架默认会为每一个表生成一个名称为id的列,int类型长度为11位,每个模型只能有一个字段指定 - 常用参数
- primary_key=True
- 如果要显示的自定义一个自增列,必须该参数
- 示例代码
class UserInfo(models.Model): # 默认 # id = models.AutoField(primary_key=True) # 自定义主键 uid = models.AutoField(primary_key=True)
3、BigAutoField
- 类
AutoField(primary_key=False [, **options]) - 说明
一个64位整数,很像一个AutoField不同之处在于它是保证从适合数字1
到9223372036854775807
- 参数
同AutoField - 示例代码
class TUser(models.Model): # 自定义主键 uid = models.BigAutoField(primary_key=True)
4、CharField
- 方法
CharField(max_length=none[, **options]) - 说明
字符串字段 - 常用参数
max_length --表明字段的最大长度(以字符为单位),utf-8下(最大为 21812),gbk下(最大为32766) - 示例代码
class UserInfo(models.Model): # 用户名 ,数据库字段的长度64 username = models.CharField(max_length=64)
5、DateField
- 方法
DateField([auto_now=False, auto_now_add=False, **options]) - 说明
日期,用Python表示的一个datetime.date
实例 - 参数
- auto_now
这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的
该字段只在调用时自动更新 Model.save()。以其他方式更新其他字段时,字段不会更新,
例如QuerySet.update()
,您可以在更新中为字段指定自定义值 - auto_now_add
这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的
- auto_now
- 注意事项
auto_now_add
,auto_now
和default
不能同时存在 - 示例代码
class UserInfo(models.Model): #账号创建时间 create_date = models.DateField(auto_now_add=True)
6、DateTimeField
- 方法
DateTimeField([auto_now=False, auto_now_add=False, **options]) - 说明
日期和时间,用Python表示的一个datetime.datetime
实例 - 参数
同DateField的参数 - 示例代码
class UserInfo(models.Model): #账号创建时间 create_date = models.DateField(auto_now_add=True) #最后一次登录时间 last_date = models.DateTimeField(auto_now=True)
7、DecimalField
- 方法
DecimalField(max_digits=None,decimal_places=None[, **options]) - 说明
表示固定精度的十进制数的字段,通常用来表示金额 - 常用参数
- max_digits
数字允许的最大位数 - decimal_places
小数的最大位数
- max_digits
- 注意事项
两个参数必传 - 示例代码
class GoodsInfo(models.Model): price = models.DecimalFile(maxdigits=9,decimal_places=2)
8、FileField
- 方法
FileField
(upload_to=None, max_length=100, _*_options*) - 说明
文件上传字段 - 参数
- upload_to
设置上传目录和文件名,可以是字符串形式,也可是一个函数 - max_length
长度
- upload_to
- 注意事项
该字段不支持primary_key和unique参数,否则类型错误 - 示例代码
class UserInfo(models.Model): # 注意前面不要加/ pic = models.FileField(upload_to='uploads/') pic = models.FileField(upload_to='uploads/%Y/%m/%d/')
""" instance 模型实例 filename 文件名称 """ def user_pic_path(instance, filename): return 'user_{0}/{1}'.format(instance.user.uid, filename) class UserInfo(models.Model): # 自定义主键 uid = models.AutoField(primary_key=True) pic = models.FileField(upload_to=user_pic_path)
9、ImageField
- 类
ImageField(upload_to = None,height_field = None_,_width_field = None_,_max_length = 100,**options) - 说明
在 FileField 基础上加上是否是合法图片验证功能的一个类型,还有height_field,width_field等属性 - 参数
- upload_to
设置上传目录和文件名,可以是字符串形式,也可是一个函数 - height_field
图片的高度 - width_field
图片的宽度
- upload_to
- 注意
该字段要求 Python Imaging 库Pillow - 示例代码
def user_pic_path(instance, filename): return 'user_{0}/{1}'.format(instance.user.uid, filename) class UserInfo(models.Model): # 自定义主键 uid = models.AutoField(primary_key=True) pic = models.ImageFiled(upload_to=user_pic_path,height_field=100,width_field=100)
10、FloatField
- 类
FloatField(**options) - 说明
与 python 里的 float 实例相同,django使用来表示它,虽然 FloatField 与 DecimalField 都是表示小数点,
但却是不同的表现形式, - 注意事项
FloatField 当小数点,但是 DecimalField 用的却是 Decimal 类型 - 示例代码
class UserInfo(models.Model): height = models.FloatField()
11、BooleanField
- BooleanField(**options)
- 说明
一个布尔值(true/false)字段。
如果要使用null作为空值,可使用NullBooleanField - 示例代码
class User(models.Model): is_delete = models.BooleanField()
12、TextField
大文本类型数据类型,尽量拆解成CharField类型
2、其它(了解)
1、IPAddressField
点分十进制表示的IP地址,如10.0.0.1
2、GenericIPAddressField
ip v4和ip v6地址表示,ipv6遵循RFC 4291section 2.2,
3、NullBooleanField
可以包含空值的布尔类型,相当于设置了null=True的BooleanField。
4、PositiveIntegerField
正整数或0类型,取值范围为[0 ,2147483647]
5、PositiveSmallIntegerField
正短整数或0类型,类似于PositiveIntegerField,取值范围依赖于数据库特性,[0 ,32767]的取值范围对Django所支持的数据库都是安全的。
6、SlugField
只能包含字母,数字,下划线和连字符的字符串,通常被用于URLs表示。可选参数max_length=50,prepopulate_from用于指示在admin表单中的可选值。db_index,默认为True。
7、SmallIntegerField
小整数字段,类似于IntegerField,取值范围依赖于数据库特性,[-32768 ,32767]的取值范围对Django所支持的数据库都是安全的
9、TimeField
时间,对应Python的datetime.time
10、URLField
存储URL的字符串,默认长度200;verify_exists(True),检查URL可用性
11、UUIDField
用于存储通用唯一标识符的字段。使用Python的 UUID类。在PostgreSQL上使用时,这将存储在一个
uuid
数据类型,否则在一个char(32)
通过的是AutoField