通过Django的ORM创建表的时候,我们需要定义自己的类。 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下。
首先看看字段的类型。尽管Python提供了近乎20种类型,他转换成数据库表之后,其实本质就是4个类型:字符串,数字,时间和二进制。
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
116
117
|
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
自定义无符号整数字段
class
UnsignedIntegerField(models.IntegerField):
def
db_type(
self
, connection):
return
'integer UNSIGNED'
PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
'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)'
,
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)
-
二进制类型
|
比如下面的例子中,CharField是字符串,EmailField同样也是字符串, 如果在数据库里面打开 可以看见类型都是varchar。那么他的区别在哪里呢?这是在通过Django admin页面管理数据库的时候,他会自动做一个验证。
例1
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
UserInfo(models.Model):
username
=
models.CharField(max_length
=
32
,blank
=
True
,verbose_name
=
'用户名'
)
password
=
models.CharField(max_length
=
60
, help_text
=
'pwd'
)
email
=
models.CharField(max_length
=
60
)
test
=
models.EmailField(max_length
=
19
,null
=
True
,error_messages
=
{
'invalid'
:
'请输入密码'
})
user_group
=
models.ForeignKey(
"UserGroup"
,to_field
=
'uid'
)
# (uid,catption,ctime,uptimew)
user_type_choices
=
(
(
1
,
'超级用户'
),
(
2
,
'普通用户'
),
(
3
,
'普普通用户'
),
)
user_type_id
=
models.IntegerField(choices
=
user_type_choices,default
=
1
)
|
数据库的表结构
Django 管理界面。第一次使用需要创建一个超级用户,方法如下 python manage.py createsuperuser。然后在admin.py里面执行执行注册,
例如
1
2
3
|
from
django.contrib
import
admin
from
app01.models
import
userinfo
admin.site.register(userinfo)
|
登录之后可以修改表的内容,他会自动进行格式的验证
Django admin界面
例2:这里定义了时间类型的字段, 同时我不希望使用自动生成的id字段,因此需要手动定义一个自增的主键
1
2
3
4
5
|
class
UserGroup(models.Model):
uid
=
models.AutoField(primary_key
=
True
)
caption
=
models.CharField(max_length
=
32
,unique
=
True
)
ctime
=
models.DateTimeField(auto_now_add
=
True
, null
=
True
)
uptime
=
models.DateTimeField(auto_now
=
True
, null
=
True
)
|
这里需要强调一下时间类型,如果在setting里面设置了USE_TZ=True, 保存在数据库里面的时间始终是UTC的时间,如果需要在模板里面显示其他的时间,可以修改TIME_ZONE='Asia/Shanghai',这样他自动会以北京时间来显示。
例如:豆子希望网页上显示悉尼的时间,可以发现数据库的时间是UTC时间,而网页输出的是悉尼时间
settings.py
1
2
3
4
5
|
LANGUAGE_CODE
=
'en-us'
TIME_ZONE
=
'Australia/Sydney'
USE_I18N
=
True
USE_L10N
=
True
USE_TZ
=
True
|
数据库表
网页
定义字段的时候,除了类型,还需要指定对应的参数。在Django里面,他提供了以下参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
null
-
> db是否可以为空
default
-
> 默认值
primary_key
-
> 主键
db_column
-
> 列名
db_index
-
> 索引
unique
-
> 唯一索引
unique_for_date
-
> 根据时间来索引
unique_for_month
-
> 根据月份来索引
unique_for_year
-
> 根据年份来索引
auto_now
-
> 创建时,自动生成时间
auto_now_add
-
> 更新时,自动更新为当前时间
choices
-
> django admin中显示下拉框,避免连表查询
blank
-
> django admin是否可以为空
verbose_name
-
> django admin显示字段中文
editable
-
> django admin是否可以被编辑
error_messages
-
> 错误信息欠
help_text
-
> django admin提示
validators
-
> django form ,自定义错误信息(欠)
|
请注意在例1中choice的使用,这样的好处是对于不怎么改变的值,可以直接保存在内存中比较快;而经常变化的值,我们还是需要使用数据库进行多表的查询