Django 数据库ORM 操作 - 字段的类型和参数

简介:

通过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 )


数据库的表结构

wKioL1ljGQrjLs7YAADQsqefoLo672.jpg



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界面

wKiom1ljGQnybalLAAD4rroV-rw331.jpg


例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


数据库表


wKioL1llw7mxrQTfAADY_5jXwpg151.jpg



网页

wKioL1llw7mzCyc0AABcPmQHMEQ392.jpg



定义字段的时候,除了类型,还需要指定对应的参数。在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的使用,这样的好处是对于不怎么改变的值,可以直接保存在内存中比较快;而经常变化的值,我们还是需要使用数据库进行多表的查询






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1945909,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
30 0
Python 教程之 Django(9)对模型中的字段进行验证
|
3月前
|
SQL 关系型数据库 MySQL
Python 数据库访问与ORM框架——打造高效开发利器
Python 作为一门广泛使用的编程语言,其在数据库访问方面也有着较为成熟的解决方案,其中ORM框架更是成为了开发者们的首选。本文将介绍 Python 中数据库访问和 ORM 框架的基本概念,以及如何使用 SQLAlchemy 这一优秀的 ORM 框架进行开发。
|
3月前
|
存储 NoSQL 关系型数据库
数据库的类型有哪些
数据库的类型有哪些
|
1月前
|
供应链 数据库 开发者
深入了解数据库锁:类型、应用和最佳实践
深入了解数据库锁:类型、应用和最佳实践
|
3月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
88 7
|
11天前
|
关系型数据库 API 数据库
Django中的数据库事务管理:确保数据一致性
【4月更文挑战第15天】Django框架提供强大的数据库事务管理,确保ACID属性,保证数据一致性和完整性。文章深入讨论了Django事务管理,包括使用`@transaction.atomic`装饰器和`transaction.atomic()`上下文管理器手动控制事务,以及低级API进行精细管理。注意避免长时间事务、选择合适隔离级别、正确处理异常及了解数据库特性。掌握这些技巧对构建可靠Web应用至关重要。
|
14天前
|
关系型数据库 MySQL 数据库连接
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
46 11
|
1月前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
20 0
|
1月前
|
缓存 中间件 API
使用 Django 的异步特性提升 I/O 类操作的性能
使用 Django 的异步特性提升 I/O 类操作的性能
42 0
|
1月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
48 0