目录
day04
1.增加数据
-
Entry.objects.create(属性=值)
返回值:创建好的实体对象 -
创建实体对象,通过save()完成保存
obj = Entry(属性=值)
obj.save() -
通过字典构建实体对象,通过save()完成保存
dic = {
'属性':'值',
}obj = Entry(**dic)
obj.save()
2.查询数据
- 所有的查询操作都要基于Entry.objects
- all()
将每个实体对象保存在列表中进行返回 -
values('列1',...)
将每个实体对象转换成字典再保存在列表中进行返回 - values_list('列1',...)
将每个实体对象转换成元组再保存在列表中进行返回 -
get(条件)
查询只返回一条数据 -
filter(条件)
- 构建等值条件
Entry.objects.filter(id=1)
- 构建不等值条件
使用 查询谓词(Field Lookups)
__gt,__ gte,__ lt,__ lte,__ contains,__ startswith,__ endnds,__ in,__ range,__ exact,__ date,__ month
- 构建等值条件
-
exclude(条件)
实现不等值条件判断 -
order_by('列','列')
排序,默认是升序,降序的话则在列前加 "-" -
aggregate()
不带分组,整表做聚合Entry.objects.aggregate(名=聚合函数('列'))
聚合函数:
Avg() ,Sum() ,Count(), Max(), Min() - annotate()
带分组的聚合Entry.objects.filter(条件).values('分组列').annotate(名=聚合函数('列')).filter(条件)
- all()
3.修改数据
- 修改单条数据
- 查
obj=Entry.objects.get()
- 改
obj.xxx = xxx - 保存
obj.save()
- 查
- 修改多条数据
调用QuerySet的update()实现批量修改
Entry.objects.filter(id=1).update(name='xxx')
4.数据删除
调用实体对象/QuerySet的 delete() 完成删除
1.F查询和Q查询
- F()
作用:在执行中获取某列的值
更新Author中所有人的age都 + 10SQL:update author set age=age+10
语法:Django: Author.objects.all().update(age=age+10)错误
from django.db.models import F
F('列名'):允许取出该列的值
Author.object.all().update(age=F('age')+10) - Q()
作用:在查询条件中可以完成 or 操作
语法:
from django.db.modles import Q
Q(条件)|Q(表达式)
ex:查询Author中id为1 或 年龄 为48 的人的信息
Author.objects.filter(Q(id=1)|Q(age=48))
SQL: select * from author where id=1 or age=48;
2.原生的数据库操作方法
- 查询
函数:raw(sql语句)
语法:Entry.objects.raw(sql)
返回:QuerySet - 增删改
from django.db import connection
def doSQL(request):
with connection.cursor() as cursor:
sql = "delete from ..."
cursor.execute(sql)
return ' '
3.使用后台管理 models
- 后台的配置
登录地址:http://localhost:8000/admin
创建后台管理员
./manage.py createsuperuser
Username:输入用户名,默认为系统账户名
Email Address:电子邮件
Password:密码
Password(agian):重复密码 - 基本管理
- 在应用中的 admin.py 中注册要管理的数据
- admin.py
作用:注册需要管理的Models类,只有在此注册的Models类才允许被管理 - 注册Models
from .models import *
admin.site.register(Entry)
admin.site.register(Entry)
- admin.py
- 通过Models类的内部类 Meta 来定义展现形式
class Author(models.Model):
... ...
class Meta:- db_table
指定该实体类映射到表的名称
(该属性设置完成后需要同步回数据库) - verbose_name
定义实体类在 admin 中显示的名字(单数) - verbose_name_plural
定义实体类在 admin 中显示的名字(复数) - ordering
指定数据在后台管理中的排序方式,取值是一个列表,将排序的列表示在列表,默认升序,降序使用 -
- db_table
- 练习:
- 修改Publisher 的后台管理
- 更改表名为 publisher
- 修改展示名称为 出版社
- 修改每个属性对应的中文名称
class Publisher(models.Model): name = models.CharField(max_length=30,verbose_name='名称') address = models.CharField(max_length=200,verbose_name='地址') city = models.CharField(max_length=50,verbose_name='城市') country = models.CharField(max_length=50,verbose_name='国家') website = models.URLField(verbose_name='网站') def __str__(self): return self.name class Meta: db_table = 'publisher' verbose_name = '出版社' verbose_name_plural = verbose_name
- 修改Book的后台管理
- 更改表名为book
- 修改展示名为 书籍
- 指定排序 - 按出版时间降序排序
- 修改每个属性对应的中文名称
class Book(models.Model): title = models.CharField(max_length=50,verbose_name='名称') publicate_date = models.DateField(verbose_name='出版时间') def __str__(self): return self.title class Meta: db_table = 'book' verbose_name_plural = '书籍' ordering=['-publicate_date']
- 修改Publisher 的后台管理
- 在应用中的 admin.py 中注册要管理的数据
- 高级管理
- 在 admin.py 中 创建高级管理类并注册
- 定义 EntryAdmin 类,继承自 admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
pass - 注册高级管理类
admin.site.register(Entry,EntryAdmin)
- 定义 EntryAdmin 类,继承自 admin.ModelAdmin
- 允许在EntryAdmin中增加的属性
- list_display
作用:定义在 列表页 上显示的字段们
取值:由属性名组成的元组或列表 - list_display_links
作用:定义在列表页中也能够连接到详情页的字段们
取值:同上
注意:取值必须要出现在list_display中 - list_editable
作用:定义在列表页中就允许修改的字段们
取值:同上
注意:取值必须出现在list_display中但不能出现在list_display_links中 - search_fields
作用:添加允许被搜索的字段们
取值:同上 - list_filter
作用:列表页的右侧增加过滤器,实现快速筛选
取值:同上 - date_hierarchy
作用:列表页的顶部增加时间选择器,取值必须是DateField 或 DateTimeField的列名 - fields
作用:在详情页中,指定显示哪些字段并按照什么样的顺序显示
取值:由属性名组成的元组或列表 - fieldsets
作用:在详情页面中,对字段们进行分组显示的
注意:fieldsets 与 fields 是不能共存的
取值:
fieldsets = (
#分组1
('分组名称',{
'fields':('属性1','属性2'),
'classes':('collapse',),
}),
#分组2
()
)
练习:完成publisher的高级管理功能- 在列表页显示name,address,city,website属性
- address 和 city是可编辑的
- 右侧增加过滤器,允许按照address和city进行筛选
- 顶部增加搜索框,允许按照name和website 进行搜索
- 详情页中分组显示
- name,address,city为‘基本选项’
- country,website 为‘高级选项’并可以折叠
class PublisherAdmin(admin.ModelAdmin): list_display = ('name','address','city','website') list_editable = ('address','city') list_filter = ('address','city') search_fields = ('name','website') fieldsets = ( ('基本选项',{ 'fields':('name','address','city'), }), ('高级选项',{ 'fields':('country','website'), 'classes':('collapse',), }) )
- list_display
- 在 admin.py 中 创建高级管理类并注册
- 关系映射
- 一对一映射
- 语法
在关联的两个类中的任何一个类中:
属性=models.OneToOneField(Entry)
class Author(models.Model):
... ...
class Wife(models.Model):
... ...
#增加对Author的一对一引用
author = models.OneToOneField(Author)
在数据库中:
生成一个外键(author_id)列在 wife 表中,要引用自author 表中的主键
在 Author 的实体中:
增加一个隐式属性叫wife - 查询
- 正向查询:直接通过关联属性查询即可
通过 wife 找 author
wife = Wife.objects.age(id=1)
author = wife.author - 反向查询:通过反向引用属性查询
通过 author 找 wife
author = Author.objects.get(id=1)
wife = author.wife
- 正向查询:直接通过关联属性查询即可
- 语法
- 一对多映射
- 语法
在‘多’实体中增加对‘一’实体中的引用
属性 = models.ForeignKey(Entry)
ex:
Book (多) 和 Publisher (一) 实现一对多关联
class Publisher(models.Model):
... ...
class Book(models.Model):
... ...
publisher = models.ForeignKey(Publisher) - 查询
- 正向查询:通过Book查询Publisher
book = Book.objects.get(id=1)
publisher = book.publisher - 反向查询:
Django默认会在publisher中增加book_set属性,来表示对应的所有书籍的查询对象
pub = Publisher.objects.get(id=1)
books = pub.book_set.all()
- 正向查询:通过Book查询Publisher
- 语法
- 多对多映射
- 语法
在关联的两个类的任意一个类中,增加:
属性 = models.ManyToManyField(Entry)
class Author(models.Model):
... ...
class Book(models.Model):
... ...
authors = models.ManyToManyField(Author) - 查询
- 正向查询:通过Book查询 Author
Author 属性只是提供了对关联表的一个查询引用,使用all(),values() 等方法获取最终数据
ex:
book = Book.objects.get(id = 1)
authors = book.authors.all() - 反向查询:
ex:
author = Author.objects.get(id = 2)
books = author.book_set.all()
- 正向查询:通过Book查询 Author
- 语法
- 一对一映射
详细笔记,请查阅
3vr5