Django框架 之 ORM 常用字段和参数
浏览目录
-
常用字段
-
字段合集
-
自定义字段
-
字段参数
-
DateField和DateTimeField
-
关系字段
-
ForeignKey
-
OneToOneField
-
ManyToManyField
常用字段
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()实例。
字段合集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
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)
-
二进制类型
|
自定义字段
1
2
3
|
class
UnsignedIntegerField(models.IntegerField):
def
db_type(
self
, connection):
return
'integer UNSIGNED'
|
自定义char类型字段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class
FixedCharField(models.Field):
"""
自定义的char类型的字段类
"""
def
__init__(
self
, max_length,
*
args,
*
*
kwargs):
self
.max_length
=
max_length
super
(FixedCharField,
self
).__init__(max_length
=
max_length,
*
args,
*
*
kwargs)
def
db_type(
self
, connection):
"""
限定生成数据库表的字段类型为char,长度为max_length指定的值
"""
return
'char(%s)'
%
self
.max_length
class
Class(models.Model):
id
=
models.AutoField(primary_key
=
True
)
title
=
models.CharField(max_length
=
25
)
# 使用自定义的char类型的字段
cname
=
FixedCharField(max_length
=
25
)
|
创建的表结构:
附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)',
字段参数
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
DateField和DateTimeField
auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
related_name
反向操作时,使用的字段名,用于代替原反向查询时的‘表名_set’
例如:
1
2
3
4
5
6
|
class
Classes(models.Model):
name
=
models.CharField(max_length
=
32
)
class
Student(models.Model):
name
=
models.CharField(max_length
=
32
)
theclass
=
models.ForeignKey(to
=
"Classes"
)
|
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
1
|
models.Classes.objects.first().student_set.
all
()
|
当我们在ForeignKey字段中添加了参数 related_name 后,
1
2
3
|
class
Student(models.Model):
name
=
models.CharField(max_length
=
32
)
theclass
=
models.ForeignKey(to
=
"Classes"
, related_name
=
"students"
)
|
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
1
|
models.Classes.objects.first().students.
all
()
|
related_query_name
反向查询操作时,使用的连接前缀,用于替换表名。
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
models.DO_NOTHING
删除关联数据,引发错误IntegrityError
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
1
2
3
4
5
6
7
8
9
|
def
func():
return
10
class
MyModel(models.Model):
user
=
models.ForeignKey(
to
=
"User"
,
to_field
=
"id"
,
on_delete
=
models.
SET
(func)
)
|
db_constraint
是否在数据库中创建外键约束,默认为True。
OneToOneField
一对一字段。
通常一对一字段用来扩展已有字段。
字段参数
to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
同ForeignKey字段。
ManyToManyField
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。
字段参数
to
设置要关联的表
related_name
同ForeignKey字段。
related_query_name
同ForeignKey字段。
symmetrical
仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
1
2
3
|
class
Person(models.Model):
name
=
models.CharField(max_length
=
16
)
friends
=
models.ManyToManyField(
"self"
)
|
此时,person对象就没有person_set属性。
1
2
3
|
class
Person(models.Model):
name
=
models.CharField(max_length
=
16
)
friends
=
models.ManyToManyField(
"self"
, symmetrical
=
False
)
|
此时,person对象现在就可以使用person_set属性进行反向查询。
through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
through_fields
设置关联的字段。
db_table
默认创建第三张表时,数据库中表的名称。
元信息
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
db_table
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。
index_together
联合索引。
unique_together
联合唯一索引。
ordering
指定默认按什么字段排序。
只有设置了该属性,我们查询到的结果才可以被reverse()。