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天前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
1月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之采集oracle的时候报ORA-65040:不允许从可插入数据库内部执行该操作如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
54 3
|
29天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之数据库执行的是UPDATE操作,那么Flink监听到的类型是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
存储 关系型数据库 MySQL
MySQL中数据库的相关操作
MySQL中数据库的相关操作
240 62
|
1天前
|
关系型数据库 MySQL 数据库
修改数据库参数
【6月更文挑战第20天】修改数据库参数。
9 1
|
11天前
|
SQL 关系型数据库 MySQL
Python 操作 MySQL 数据库
Python 操作 MySQL 数据库
|
15天前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
15 2
|
16天前
|
Java 数据库连接 数据库
Spring日志完结篇,MyBatis操作数据库(入门)
Spring日志完结篇,MyBatis操作数据库(入门)
|
16天前
|
存储 SQL 数据可视化
【Databend】数据库和表操作
【Databend】数据库和表操作
18 1
|
22天前
|
监控 关系型数据库 数据库
关系型数据库识别常查询字段
【5月更文挑战第20天】
32 4

热门文章

最新文章