目录
练习代码 https://blog.csdn.net/zh__quan/article/details/82155617
1.Models - 模型
1.查询
1.只查询一条数据
语法:get()
用法:Entry.objects.get()
注意:
适合于只能查询一条数据时使用
查询多于一条结果或没查询出结果时都会抛异常
2.根据条件查询部分行数据(重难点)
语法:filter(条件)
用法:Entry.objects.filter(条件)
1.使用Entry中的属性作为查询条件
如果有多个查询条件的话,使用 ,隔开,映射到sql语句中,一律使用and进行关联
ex:
1.Author.objects.filter(id=1)
select * from index_author where id=1
2.Author.objects.filter(id=1,name='老舍')
select * from index_author where id=1 and name='老舍'
2.使用Field Lookups(查询谓词)完成复杂条件查询
查询谓词:每一个独立的查询谓词就是一个独立的查询条件
所有支持使用查询条件的位置处,都允许使用 查询谓词
filter(),get(),exclude()
Entry.objects.filter(属性__查询谓词=值)
练习:
在Author 实体中,查询所有email中包含字符'a'的Author的信息
Author.objects.filter(email__contains='a')
2.修改
1.修改单个数据
1.查
通过get()得到要修改的实体对象
2.改
通过实体对象的属性修改值
3.保存
通过实体对象的save()保存回数据库
练习:
1.将id为1的Author的name属性值修改为 舒庆春
au = Author.object.get(id=1)
au.name = '舒庆春'
au.save()
2.批量修改数据
调用查询结果集的update(属性=值,属性=值)实现批量修改
将age=85的author的信息的email更改为[email protected]
Author.objects.filter(age=85).update(email='[email protected]')
3.删除
调用实体对象/查询结果集的 delete() 可以完成删除
1.删除单个对象
au = Author.objects.get(id=1)
au.delete()
2.删除多个对象
auList = Author.objects.filter(age__gte=58)
auList.delete()
练习:
1.Author实体中增加一个列,isActive(BoolenaField),默认值为True
2.删除:将对应author的isActive更改为False
3.查询:只查询出isActive为True的信息,其余的不查询
4.转发 & 重定向
1.转发
将请求转交给其他的视图去处理
表现:地址栏不会发生改变
原因:只有一次请求,所以地址栏上就是最初请求的地址
2.重定向
重新向新的地址发送请求
语法:
HttpResponseRedirect('重定向地址')
redirect('重定向地址')
表现:地址栏会实现最后一次请求的地址
原因:重定向导致浏览器向服务器发送了两次请求
5.F查询 和 Q查询
1.F()
作用:用于在执行中获取某列的值
语法:
from django.db.models import F
F('列名')
Author.objects.all().update(age=F('age')+10)
2.Q()
作用:在查询条件中完成或(or)的操作
语法:
from django.db.models import Q
Q(条件1)|Q(条件2)
#查询id为1 或 年龄大于100的人的信息
Author.objects.filter(Q(id=1)|Q(age__gt=100))
2.使用后台管理Models
1.创建后台管理员
./manage.py createsuperuser
Username:输入用户名,默认为...
Email Address:输入电子邮件地址
Password:输入密码
Password(again):确认密码
2.基本管理
1.在应用中的 admin.py 中注册要管理的Models
1.admin.py
作用:注册要管理的Models,只有在此注册Models才允许被管理
2.注册 Models
from .models import *
from django.contrib import admin
admin.site.register(Entry)
2.修改models.py去处理显示的内容
1.在models.py中的各个class追加
def __str__(self):
return self.name
2.为各个class中的属性增加字段说明
verbose_name='显示名称'
ex
name=models.CharField(max_length=30,verbose_name='姓名')
3.为各个class追加内部类 Meta
class Entry(models.Model):
... ...
... ...
class Meta:
1.db_table
指定该实体对应到表的名称,取值为字符串
该操作必须先同步回数据库
2.verbose_name
指定该实体类在admin中显示的名字(单数)
3.verbose_name_plural
指定该实体类在admin中显示的名字(复数)
verbose_name_plural = verbose_name
4.ordering
指定实体信息们在列表页的排序规则
取值是一个列表,默认按升序排序,降序的话使用"-"
3.高级管理
1.在admin.py中创建高级管理类
1.定义高级管理类 - EntryAdmin
必须继承自 admin.ModelAdmin
ex:
class AuthorAdmin(admin.ModelAdmin):
pass
2.注册高级管理类
admin.site.register(Entry,EntryAdmin)
2.允许在EntryAdmin中增加的管理属性
1.list_display
作用;指定在列表页中能够显示的字段们
取值:由属性名组成的元组或列表
2.list_display_links
作用:定义在列表页中也能够链接到详情页的字段们
取值:同上
注意:取值必须出现在list_display中
3.list_editable
作用:指定在列表页中就允许被修改的字段们
取值:取值必须出现在list_display中但不能出现在list_display_links中
4.search_fields
作用:指定允许被搜索的字段们
取值:同上
5.list_filter
作用:在列表页的右侧增加一个过滤器,允许实现快速筛选
取值:同上
6.date_hierarchy
作用:在列表页的顶部增加一个时间选择器
取值:取值必须是DateField 或 DateTimeField
7.fields
作用:在详情页面上,要显示哪些字段并按照什么样的顺序显示
8.fieldsets
作用:在详情页面中对字段们进行分组显示
注意:fieldsets 与 fields 是不能共存的
取值:
fieldsets = (
#分组1
(
"分组名称",{
'fields':('属性1','属性2'),
}
)
#分组2
()
)
作业:
为 Publisher 增加管理功能
1.基本功能
1.指定每个列所显示的名称
2.指定表名为 publisher
3.指定每个实体对象在列表页中所显示的中文名
2.高级功能
1.在列表页中显示name,address,city属性值
2.address 和 city 是可编辑的
3.右侧显示过滤器,允许按照 city 和 country 进行筛选
4.分组显示
name,address,city 为基本选项
country,website为高级选项,并可折叠