day03
1.模板的继承
1.父模板
{% block 名称 %}
{% endblock %}
2.子模板
1.指定继承模板
{% extends '父模板名称' %}
2.编写要覆盖的内容
{% block 名称 %}
{% endblock %}
2.url() 的name属性 - 反向解析
1.为 url 的name属性赋值
url(r'',views,name='名称')
1.模板中反向解析
{% url 'name值' '参数1' '参数3' %}
2.视图中反向解析
url=reverse('name值',args=('参数1','参数2'))
3.创建模型
class ClassName(models.Model):
属性名=models.字段类型(字段选项)
字段类型:
1.CharField(max_length=50)
2.IntegerField()
3.FloatField()
4.DecimalField(max_digits=7,decimal_places=2)
5.EmailField()
6.URLField()
7.ImageField()
8.DateField()
9.DateTimeField()
10.BooleanField()
字段选项:
1.default
2.null
3.db_column
4.相关指令
1.版本切换
./manage.py migrate 应用名称 版本号
2.通过数据库自动导出models类
./manage.py inspectdb > 文件名.py
1模型中的CRUD
- 增加数据
- Entry.objects.create(属性=值,属性=值)
返回值:创建好的实体对象 - 创建一个Entry 对象,并通过 save() 进行保存
obj = Entry(属性=值,属性=值)
obj.属性 = 值
obj.save()
无返回值,保存成功后,obj 会被重新赋值 - 使用字典创建对象,并通过 save() 进行保存
dic = {
'属性1':'值1',
'属性2':'值2',
}
obj = Entry(**dic)
obj.save()
练习:
使用插入数据的三种实现方式,分别向Book,Publisher 三个实体表中各增加三条数据
- Entry.objects.create(属性=值,属性=值)
- 查询数据(重难点)
通过 Entry.objects 调用查询接口函数
ex:
Entry.objects.filter()
Entry.objects.exclude()
所有的查询接口函数,都可以通过一个query 属性来得到对应的sql语句
Entry.objects.filter().query- 基本查询操作
语法:all()
用法:Entry.objects.all()
返回:QuerySet(查询结果集,是一个封装了若干对象的列表) - 查询返回指定列
语法:values() | values('列1','列2',...)
作用:查询一个QuerySet中的部分列,并封装成字典,再放到列表中
用法:
Entry.object.values()
Entry.object.values('列1','列2')
也允许将values() 放在其他返回查询结果集的方法的后面
Entry.objects.all().values()
Entry.objects.filter.values() - 查询返回指定列
语法:values_list()
作用:将结果封装到元组中再封装到列表中
用法:同values
练习:
效果:查询Author表中所有的数据显示在网页上
姓名 年龄 邮箱 操作
王老师 32 xxx.@xx 删除 修改 - 只查询一条数据
语法:get(条件)
作用:查询只返回一条数据
用法:Entry.objects.get(条件)
注意:
该方法只能查询一条数据
查询多于一条数据或没查询出结果的话那么都会抛异常 - 根据条件查询部分行数据
语法:filter(条件)
用法:Entry.objects.filter(条件)
ex:- 想查询id为1的Author的信息
Author.objects.filter(id=1) - 想查id为1,并且name为隔壁老王的信息
Author.objects.filter(id=1,name='隔壁老王')
注意:- 多条件,用,隔开即可
- 用,隔开的条件,映射到sql中是用 and 来连接的
- 想查询age 大于等于 30 的 author 的信息
Author.objects.filter(age>=30) #错误
在条件查询中,Django提供了若干查询谓词(Field Looups),可以完成非等值条件的查询
Entry.objects.filter(属性_查询谓词=值)
所有支持条件查询的位置处都支持查询谓词:
filter(),get(),exclude()
练习:- 查询出age大于等于30的Author的信息
authors = Authors.objects.filter(age__gte=30) - 查询出所有姓‘王’的Author的信息
authors = Authors.objects.filter(name__startswith='王') - 查询出所有email中包含‘wang’的Author的信息
authors = Authors.objects.filter(emial__contains='wang')
- 查询出age大于等于30的Author的信息
- 想查询id为1的Author的信息
- 对条件取反
语法:exclude(条件)
用法:Entry.objects.exclude(条件)
ex:
Author.objects.exclude(id=1)
select * from index_author where not(id=1)
Author.objects.exclude(id=1,age__lt=30)
select * from index_author where not (id=1 and age < 30) - 聚合查询(不带分组)
语法:aggregate()
语法:
Entry.objects.all().aggregate(名=聚合函数('列'))
ex:
Author.objects.all().aggregate(avg=Avg('age'))
聚合函数:- Avg():平均值
- Count():数量
- Sum():求和
- Min():最小值
- Max():最大值
- 聚合查询(带分组)
语法:annotate()
用法:Entry.objects.all().values('列1','列2').annotate(列=聚合函数()).values('列1','列2')
ex:
result = Author.objects.values('isActive').annotate(sum=Sum('age')).all() - 排序查询
语法:order_by()
用法:Entry.objects.order_by('列1','-列2')
默认是升序排序,列名前加 - 则表示降序排序
- 基本查询操作
- 修改
- 修改单个实体
- 查
通过get() 得到要修改的实体对象
ex:
au = Author.objects.get(id=2) - 改
通过对象的属性修改对象的值
ex:
au.age = 38
au.email = '[email protected]'
au.isActive = False - 保存
通过对象的save() 保存回数据库
ex:
au.save()
- 查
- 批量修改数据
调用QuerySet 的 update(属性=值,属性=值)实现批量修改
ex:
Author.objects.filter(isActive=False).update(isActive=True)
- 修改单个实体
- 删除
调用实体对象/查询结果集的 delete() 完成删除- 删除单个对象
au = Author.objects.get(id=1)
au.delete - 删除多个对象
ex:删除Author 表中isActive的值为False的所有数据
auList = Author.objects.filter(isActive=False)
auList.delete
- 删除单个对象
示例 请点击
kxdi