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,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
缓存 数据库 数据安全/隐私保护
Discuz! X 数据库字典详解:DZ各数据表作用及字段含义
我们使用DISCUZ做网站时,有时需要对数据表进行操作,在操作数据表之前,需要对数据表进行了解。下面是DISCUZ 数据库各数据表作用及字段含义详解,方便新手更好的了解DISCUZ数据库。
48 4
|
1月前
|
数据库 Python
django中的models.ManyToManyField 字段如何新增,通过Category,如何反向查询Product
django中的models.ManyToManyField 字段如何新增,通过Category,如何反向查询Product
60 10
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
65 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
存储 移动开发 数据库
HTML5 Web IndexedDB 数据库常用数据存储类型
IndexedDB 支持多种数据存储类型,满足复杂数据结构的存储需求。它包括基本数据类型(如 Number、String、Boolean、Date)、对象(简单和嵌套对象)、数组、Blob(用于二进制数据如图像和视频)、ArrayBuffer 和 Typed Arrays(处理二进制数据)、结构化克隆(支持 Map 和 Set 等复杂对象),以及 JSON 数据。尽管不直接支持非序列化数据(如函数和 DOM 节点),但可以通过转换实现存储。开发者应根据具体需求选择合适的数据类型,以优化性能和使用体验。
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
59 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
63 8
|
2月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
2月前
|
JSON 数据库 数据格式
数据库表如果有json字段,该怎么更新
数据库表如果有json字段,该怎么更新
|
3月前
|
SQL 存储 数据库
|
3月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
79 0