Django进阶
Django进阶篇(一)
目录
前文我们提到了django基础篇:https://www.cnblogs.com/encp/articles/9167847.html,现在我们继续深入了解django的一些知识,内容主要包括了ORM的基本操作、静态文件的使用、模板的继承等。
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 [1] 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,ibatis,speedframework。
ORM的方法论基于三个核心原则:
· 简单:以最基本的形式建模数据。
· 传达性:数据库结构被任何人都能理解的语言文档化。
· 精确性:基于数据模型创建正确标准化了的结构。
ORM的方法论基于三个核心原则:
· 简单:以最基本的形式建模数据。
· 传达性:数据库结构被任何人都能理解的语言文档化。
· 精确性:基于数据模型创建正确标准化了的结构。
在ORM中,以前数据库中的一些名称在这里怎么叫呢?
表明--------------类名
字段--------------类属性
ORM的优缺点
ORM的缺点是会牺牲程序的执行效率和会固定思维模式。
从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。
在我们开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确的使用上。ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。
在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。
但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。
ORM的缺点是会牺牲程序的执行效率和会固定思维模式。
从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。
在我们开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确的使用上。ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。
在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。
但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊处理的部分对绝大多数的系统,应该是很少的。
create table book(
id int(4) primary key auto_increment,
name varchar(20),
price double(5,2)
)
首介绍下ORM常用字段
AutoField:int自增型,必须填入参数 primary_key = True 。当model中如果没有自增列,则自动会创建一个列名为id的列。 IntegerField:一个整数类型,范围在 -2147483648 to 2147483647。(不能用于保存手机号) CharField:字符类型(定长的),必须提供 max_length 参数,max_length表示字符长度,相当于SQL中的varchar语句。 DateField:日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
verbose_name:为字段设置别名,max_length设置字段长度,unique:布尔值,设置字段唯一
class Blog(models.Model):
"""
博客信息
"""
nid = models.AutoField(primary_key=True)
title = models.CharField(verbose_name='个人博客标题', max_length=64)
site = models.CharField(verbose_name='个人博客后缀', max_length=32, unique=True)
theme = models.CharField(verbose_name='博客主题', max_length=32)
建立外键的语法:
blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid',on_delete=models.CASCADE)
随后:
创建数据表映射:
python manage.py makemigrations
生成数据表:
python manage.py migrate
首先是插入数据,mysql中我们怎么玩?insert into 表名(字段...) values(对应的值...),ORM简单了,它这么玩!
方式一:
利用创建的表,直接save方法插入数据
t = Teacher(name='ncp', age=22)
t.save()
方式二:
Teacher.objects.create(
name='ncp',
age=22,
)
ORM怎么查询?
首先是查询所有数据---->mysql:select * from 表名;
teacher_list = Teacher.objects.all()
for i in teacher_list:
print(i.name,i.age)
带条件查询:
方式一:
publish_obj = Teacher.objects.get(id=2)
方式二:
teacher_list = Teacher.objects.filter(age__gt=23).first()
加了first()相当于取出这个集合中的值,不加取出的就是一个集合那。
这里注意了!
filter与get方法比较
filter取出来的事一个集合对象 【Quertyset <obj>1,<obj2>】,get取出来的是一个对象
只有Quertyset集合对象能够调用update,object不能调用update
推荐使用filter+update,提高效率
万能的双下划线查询
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别
# 例如:
# 查询教语文的老师的姓名;这里进行了连表,通过teacher外键
# sname = Study.objects.filter(sname='语文').values('teacher__name')
ORM修改数据
Teacher.objects.filter(name='聂成平').update(age=25)
PS:如果要修改表结构,如果要新增一个字段,一定要为改字段添加默认值,例如我为一个表新增一个title字段:
title = models.CharField(max_length=32,default='ppp')
MYSQL的update
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
ORM删除数据
Teacher.objects.filter(age__gt=23).delete()
MYSQL的delete
语法:
DELETE FROM 表名
WHERE CONITION(过滤条件);
以上就是我们ORM对数据或者表的基本的增删改查那!
砸门平时用的导入的什么bootstrap、jquery、图片、等文件都叫静态文件
1 引入静态文件:
将静态文件放入static文件夹中,这个文件夹在setting中设置,注意这里的static文件夹要以python包的形式导入!

那么我们为什么新建的放入静态文件的文件夹要叫static呢?这就是我们说的别名那,你在setting中设置的别名,就是为了让系统直接定位到这个目录文件夹下面的静态文件。
前端导入静态文件的两种方式,方式一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bs/css/bootstrap.css">
<script src="/static/js/jquery-3.1.1.js"></script>
<link rel="stylesheet" href="/static/css/login.css">
</head>
方式二:
{% load staticfiles %} {# 加载 #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册界面</title>
<link rel="stylesheet" href="{% static 'bs/css/bootstrap.css'%}">
<link rel="stylesheet" href="{% static 'css/reg.css' %}">
<script src="{% static 'js/jquery-3.1.1.js' %}"></script>
</head>
整体流程总结
我们之前在django基础篇中讲到了模板,那么如果我们几个也,页面信息有重复共用的部分,如果我们不用继承那么是不是就意味着我们需要为每个网页设计代码,是不是就会出现没有效率的情况?
因此,这里引入了模板继承的概率,比如我们在templates中建立一个base.html的模板作为母版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Text</title>
<style>
.header{
width: 100%;
height: 48px;
background-color: dodgerblue;
position: fixed;
top: 0;
left: 0;
}
.left{
width: 200px;
position: fixed;
top: 48px;
bottom: 0;
left: 0;
background-color: silver;
}
.right{
position: fixed;
top: 48px;
left: 200px;
right: 0;
bottom: 0;
overflow: auto;
}
</style>
</head>
<body>
<div class="header">
</div>
<div class="content">
<div class="left">
<ul class="title">
<li><a href="/blog/2018/">菜单一</a></li>
<li><a href="/blog/2017/">菜单二</a></li>
<li><a href="/blog/2016/">菜单三</a></li>
</ul>
</div>
<div class="right">
{# 在母版下定义下面的语句是为了让继承他的模板可以在这个盒子下自定义内容#}
{% block con %}
<h4>con</h4>
{% endblock %}
{# 如果定义了两个,继承他的模板修改的是con区域,那么page还会保留在继承模板中#}
{# {% block page %}#}
{# <h4>page</h4>#}
{# {% endblock %}#}
</div>
</div>
</body>
</html>
我们新建一个text.html作为子模板,来继承母版,子模板内容如下:
{#继承整个模板#}
{% extends 'base.html' %}
{#取出继承的并且自己要修改的区域#}
{#语法 {% block 名称 %} #}
{# {% endblock %} #}
{# 如下 #}
{% block con %}
{{ block.super }} {# 取出母版中的内容 #}
<h1>my_self</h1>
<h1>my_self</h1>
<h1>my_self</h1>
<h1>my_self</h1>
{% endblock %}
到此为止,django进阶的内容已经讲了一部分了,博主也和各位读者一起进步,博客也会随着自己能力的提升而进行升级,下次再更新django进阶第二篇

浙公网安备 33010602011771号