django orm 基本Field介绍
ORM:object relational mapping,对象关系映射
django中使用原生sql的弊端:
1、SQL语句重复率很高,利用率不高
2、如果业务逻辑生变,原生SQL更改起来比较多
3、容易忽略一些web安全问题,如SQL注入
ORM的优点:
易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
设计灵活:可以轻松的写出复杂的查询。
可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgreSQL和SQLite。可以非常轻松的切换数据库。
ORM常用字段类型:
1、CharField:字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性以定义该字符串的最大长度,如果超过254个字符,就不建议使用CharField了,此时建议使用TextField。
2、EmailField:在数据库底层也是一个varchar类型,默认最大长度是254个字符,当然也可以自己传递max_length参数,这个Field在数据库层面不会限制一定要传递符合email条件的字符串,只是以后在使用ModelForm表单验证时,会起作用
3、URLField:类似于CharField,在数据库底层也是一个varchar类型,只不过只能用来存储url格式的字符串。并且默认的max_length是200,同EmailField
4、FloatField:浮点数类型,映射到数据库中会变成double类型
5、IntegerField:整数类型,映射到数据库中会变成11位的int类型
6、BigIntegerField:大整形。值的区间是-9223372036854775808——9223372036854775807
7、PositiveIntegerField:正整形。值的区间是0——2147483647
8、SmallIntegerField:小整形。值的区间是-32768——32767
9、PositiveSmallIntegerField:正小整形。值的区间是0——32767
10、BooleanField:布尔类型(True/False),映射到数据库中会变成长度只有1位的tinyint类型,这个Field不接受null参数,要想使用可以为null的布尔类型的字段,就要使用NullBooleanField
11、AutoField:自增长类型,映射到数据库中是11位的整数,使用此字段时,必须传递primary_key=True,否则在生成迁移脚本文件时,就会报错,一个模型不能有两个自增长字段。一般情况下我们用不到这个字段,如果不定义主键,django会自动的为我们生成id字段作为主键
12、BigAutoField:自增长类型,用法同AutoField。映射到数据库中会成为20位的bigint类型
13、DateTimeField:日期时间类型,在python中对应的是datetime.datetime类型,在映射到数据库中也是datetime类型。使用这个Field可以传递以下几个参数:
auto_now=True:在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段
auto_now_add=True:在每条数据第一次被添加进去的时候,都使用当前的时间。比如作为一个记录第一次入库的字段
注意:如果在setting.py中配置了USE_TZ=True,那么上两个默认值都来自于django.utils.timezone.now所转化来的值
在模板中将一个UTC时间转换成本地时间:
首先模板HTML文件的开头导入tz:
{% load tz %}
在传递过来的时间变量utc_time中使用localtime过滤器:
{{utc_time | localtime}}
其实,django知道我们的想法,已经为我们做好了配置,我们并不需要配置其他的东西就可以直接使用{{utc_time}},此时只要我们在setting.py文件中设置 USE_TZ=True,TIME_ZONE='Asia/Shanghai',UTC时间变量在渲染到模板上的时候会自动的为我们加载成TIME_ZONE中所设置的时区的时间。
14、DateField:日期类型,用法同DateTimeField,在python中对应的是datetime.date类型,在映射到数据库中是date类型
15、TimeField:时间类型,用法同DateTimeField,在python中对应的是datetime.time类型,在映射到数据库中是time类型
16、FileField:用来存储文件的
17、ImageField:用来存储图片文件的
18、TextField:大量的文本类型
19、DecimalField: 一个固定精度的十进制数类型,使用时必须要传递两个参数,max_digits数字的最大总长度(不含小数点),decimal_places小数部分的长度
Field的常用参数:
1、null:标识是否可以为空,默认是为False。在使用字符串相关的Field(CharField/TextField/URLField/EmailField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,由于BooleanField不接受null参数,因此你如果想要设置这个字段可以为空的bool类型,那么对应的可空的bool类型字段则为NullBooleanField。
2、blank:标识这个字段在表单验证的时候是否可以为空,默认是False。这个和null是有区别的,null是一个纯数据库级别的。而blank是表单验证级别的。
3、db_column:这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。
4、db_index:标识这个字段是否为索引字段。
5、default:默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。在用函数作为值传递给default时,只能传递函数名,不需要加括号。
6、primary_key:是否为主键,与AutoField/BigAutoField连用,默认是False。
7、unique:在表中这个字段的值是否唯一,在数据库中就是唯一约束,一般是设置手机号码/邮箱等。
8、choices:在一个范围内选择出一项,注意这个选项与ForeignKey的区别
作用:1、django admin中显示下拉框;2、避免连表查询
TYPE_CHOICES = ( #数据库只保存内部元祖的第一个值,后面的值保存在内存中
(0, '---'),
(1, '第一类'),
(2, '第二类'),
(3, '第三类'),
)
type = models.IntegerField(default=0,choices=TYPE_CHOICES)
模型中Meta配置:
对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。示例代码如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,null=True,blank=True)
class Meta:
db_table = 'book_model'
以下将对Meta类中的一些常用配置进行解释。
1、db_table:这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型所在app的名称加上模型名的小写来作为默认的表名。
2、ordering:设置在提取数据的排序方式,因为可以按照多个字段以优先关系进行排序,所以需要传递一个字段的列表,在我们提取数据时,可以根据列表中字段从前到后(优先级从高到低)的方式排序,排序默认为正序,如果你需要哪个字段按倒序排列,就可以在这个字段前面加上"-"。后面章节会讲到如何查找数据。比如我想在查找数据的时候根据添加的时间排序,那么示例代码如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date',]
django orm 基本Field介绍的更多相关文章
- Django - orm字段类型介绍
1.根据类自动创建数据库表 #app.py下的models.py python manage.py makemigrations python manage.py migrate 执行完上述命令后,自 ...
- Django ORM介绍 和字段及字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- django orm介绍以及字段和参数
Object Relational Mapping (ORM) orm介绍 orm概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数 ...
- Django ORM模型
Object Relational Mapping(ORM) 一,ORM介绍 1, ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...
- 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)
add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...
- Django ORM之QuerySet
Django ORM用到三个类:Manager.QuerySet.Model.Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己 ...
- django -orm操作总结
前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...
- Django ORM --- 建表、查询、删除基础
1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...
- Django ORM字段和字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
随机推荐
- LeetCode Missing Number (简单题)
题意: 给一个含有n个整数的数组,数组中的元素应该是0-n.现在缺了其中某1个,找出缺少的那个整数? 思路: 0-n的总和是可以直接计算的,而缺少的那个就是sum减去数组的和. int missing ...
- linux 命令——33 df(转)
linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...
- IOS 导航控制器基本使用(UINavigationController代码创建方式)
● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...
- 使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10
使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10 [问题点数:40分,结帖人xieyongqiu] 不显示删除回复 ...
- UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)
题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...
- 第四章 用javascript和DOM去建立一个图片库
把整个图片库的浏览链接集中安排在你的图片库里,只在用户点击了这个主页里的某个图片链接时才把相应的图片传送给它. 代码如下: <body> <ul> <li> < ...
- 使用webpack从零开始搭建react项目
webpack中文文档 webpack的安装 yarn add webpack@3.10.1 --dev 需要处理的文件类型 webpack常用模块 webpack-dev-server yarn a ...
- C#做项目时的一些经验分享
1.对于公用的类型定义,要单独抽取出来,放到单独的DLL中. 2.通过大量定义interface接口,来提高模块化程度,不同功能之间通过实现接口来面向接口编程. 3.如果项目中存在很多非常相似,但是又 ...
- Java设计模式学习——设计原则
第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...
- java Html&JavaScript面试题:HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交?
提交的验证方法(通过单个字符比较): <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...