模型
1.字段和模型
1.field Type
1.BooleanField()
2.EmailField() 存电子邮件-varchar
3.ImageField() 存图片路径-varchar
4.ImageField(upload_to = "static/**/**")
5.IntergerField()
6.URLField()
7.TextField()#存大量文本数据的 -text
8.DecimalField()
9.CharField()
2. field option(字段选项)
1. max_length
指定数据的最大长度
在CharField()中必须要设置的选项
2. default
为当前字段指定默认值
3. Null
指定当前字段是否允许为空, 默认值是 false
练习:完善FruitDay部分的models
1. models 商品的类型,商品, 用户
2.商品类型 GoodsType
1. 类型名称-title
2. 类型图片-picture
默认上传至: static/upload/goodstype
3. 类型描述-desc
3.商品 Goods
1.商品名称:name
2.商品价格:price(DecimalField)
3.商品规格:spec
4.商品图片:picture
默认上传至:static/upload/goods
5.销售状态:isActive(默认为True)
4.用户: User
1.电话号码:uphone
2. 密码:upwd
3. 电子邮件:uemail
4. 用户名: uname
5. 用户状态:isActive 默认为True
6.
3.数据的版本转换
1.python3 manage.py migrate
执行所有应用中最新版本的数据库中间文件
2. ./manage.py migrate 应用名称 版本号
执行应用中,版本号 对应的中间文件
4.通过数据库自动导出Models
python3 inspectdb > 文件名.py
python3 inspectdb >
3.模型中的CRUD
1.通过ORM 向 DB 中增加数据
1. Entry.objects.create(属性=值,属性=值)
Entry:具体要操作的Model类
ex:
1. Author.objects.create( name="张三丰",age=33)
2. 创建一个Models对象, 通过对象的save()
obj = Author(name="laoshe",age=33)
obj.save()
3.使用字典来构建对象,通过save()
完成增加
dic = {
"属性1":值1,
"属性2":值2,
"属性3":值3,
}
obj = Entry(**dic)
obj.save()
练习:
使用三种方式,分别想Publisher,Book 中
各增加三条数据
2.查询操作(重难点)
1.通过Entry.objects 调用查询接口
2.基本查询操作
语法: all()
用法: Entry.objects.all()
返回: QuerySet
3.查询指定列
语法 values("列1","列2",..)
用法: Entry.object.values('列1','列2',....)
返回: QuerySet
ex:
Author.objects.values('name','age')
等同于 select name,age,from index_Author
{'names': '朱自清', 'age': 33}
{'names': '朱自清', 'age': 33}
{'names': 'laoshe', 'age': 33}
{'names': '你好', 'age': 33}
注意:values()可以用在所有的返回查询结果集的方法后面
Author.objects.all().values("names","age")
4. 排序函数
语法:order_by("列1","列2")
用法:Entry.objects.order_by("列1",'列2')
默认的排序规则是升序
如果需要降序,则在列前添加一个"-"
ex:
1.Author.object.order_by("age")
2.Author.object.all().order_by("-age")
5. 对条件取反
用法:Entry.objects.exclude(条件)
ex:
1.Author.objects.exclude(id=3)
select * from author where not(id=3)
2. Author.objects.exclude(id=3,age=85)
select * from author where not (id=3 and age=85)
6. 根据条件查询部分行数据(重难点)
方法:filter(参数)
用法: Entry.object.filter(参数)
1.使用Entry中的属性作为查询参数
多个参数的话, 使用","隔开, 映射到sql语句上
是使用and来进行关联的
ex:
1.Author.objects.filter(id=1)
select * from author where id=1
2. Author.objects.filter(id=1,name="莫言")
select * from author where id=1 and name="莫言"
2.通过Field Lookup(查询表达式)完成复杂条件的构建
1.查询表达式:每个查询表达式都是一个独立的查询条件
可以用在所有的有查询条件的位置处
2.__exact
作用:精确查询, 等值判断
用法:Entry.objects.filter(属性__exact=值)
ex:
Author.objects.filter(id__exact=1)
select * from author where id = 1;
3.__contains
作用: 筛选出属性中包含指定关键字的记录(模糊查询)
ex:
Author.objects.filter(names_contains = "ao")
select * from author where names like "%ao%"
4.__lt
作用: 筛选出属性值小于指定值的记录
5.__lte:
作用:筛选出属性值小于等于指定值的记录
6.__gt
作用: 筛选出属性值大于指定值的记录
7.__startswitch
作用: 筛选出以指定关键字开始的记录
8.__endswith
作用: 筛选出以指定关键字结束的记录
3.查询只返回一条数据
语法:get(条件)
用法:Entry.objects.get(查询条件/表达式)
注意:
该函数只用于查询一条数据.
练习;
http://localhost:8000/03_aulist/
显示01_aulist.html视图
3.修改数据
1.修改单个数据
1.通过get()得到要修改的实体对象
2. 通过实体对象的属性修改属性值
3. 在通过实体对象的save()保存回数据库
ex:
au = Author.objects.get(id=1)
au.name = "laoshe"
au.age = 45
au.save()
2.批量修改数据
调用查询结果集的update()完成批量修改
Entry.objects.all().update(属性=值,属性=值)
ex:
Author.objects.all().update(age=75)
4.删除数据
调用实体对象/查询结果集的delete()即可
1. 删除单个对象
obj = Author.objects.get(id = 1)
obj.delete()
2. 删除多个对象
Author.objects.all().delete()
练习:
完成删除操作
1.点击删除链接是,删除对应的数据
http://localhost:8000/04_delete/id
2.在对应的视图中接收参数,并将对应的author删除
作业:在查询列表的基础上完成下列操作
1.点击修改的时候,将该用户的信息显示在05_au_html上
2.每个数据都用文本框显示
2.改版删除操作
1.在Author 实体中增加一个属性,isActive,
2. 在查询列表中,点击删除时,将要删除的用户isAcive更改为False
3. 查询所有的数据时候, 只查询isActive为true的用户
并显示在模板上