from django.http import HttpResponse
from django.shortcuts import render
from book.models import BookInfo
# Create your views here.
def index(request):
# 1.到数据库中查询书籍
books = BookInfo.objects.all()
# 2.组织数据
context = {
'books': books
}
# 3.传递给模板
# render(request,'',context)
return HttpResponse('index')
"""
类似于 ipython的东西
python manage.py shell
"""
##############################新增数据#####################################
from book.models import BookInfo
# 方式1
# 会把新生成的对象返回给我们
book = BookInfo(
name='python',
pub_date='2000-01-01'
)
# 需要手动调用save方法
book.save()
# 方式2 直接入库
# objects 模型的管理类
# 我们对模型的 增删改查 都找它
# 会把新生成的对象返回给我们
BookInfo.objects.create(
name='java',
pub_date='2010-1-1'
)
##############################修改(更新)数据#####################################
from book.models import BookInfo
# 方式1
# 1.先查询数据
# select * from bookinfo where id=1
book = BookInfo.objects.get(id=1)
# 2. 直接修改实例的属性
book.readcount = 20
# 3.调用save方法
book.save()
# 方式2 直接更新
# filter 过滤
BookInfo.objects.filter(id=1).update(
readcount=100,
commentcount=200
)
##############################删除数据#####################################
# 方式1
# 1. 先查询出数据
book = BookInfo.objects.get(id=5)
# 2.调用删除方法
book.delete()
# 方式2
BookInfo.objects.filter(id=6).delete()
###############################基本查询#####################################
# get 得到某一个数据
# all 获取所有的
# count 个数
# select * from bookinfo where id=1
# 返回一个对象
book = BookInfo.objects.get(id=1)
# 查询id 不存在的数据会抛出异常
book = BookInfo.objects.get(id=100)
"""
book.models.DoesNotExist: BookInfo matching query does not exist.
"""
try:
book = BookInfo.objects.get(id=2)
# except Exception :
# pass
except BookInfo.DoesNotExist:
pass
# 返回所有结果,列表
BookInfo.objects.all()
# count
BookInfo.objects.all().count()
BookInfo.objects.count()
###############################filter,get,exclude#####################################
"""
select from bookinfo where 条件语句
相当于 where查询
filter : 筛选/过滤 返回 n个结果 (n = 0/1/n)
get : 返回1个结果
exclude : 排除掉符合条件剩下的结果 相当于 not
语法形式:
以filter(字段名__运算符=值) 为例
"""
# 查询编号为1的图书
# get返回的是对象
# exact 精确的 准确的 就是等于
BookInfo.objects.get(id__exact=1)
BookInfo.objects.get(id=1)
# 返回列表
BookInfo.objects.filter(id=1)
BookInfo.objects.filter(id=1)[0]
BookInfo.objects.filter(id__exact=1)
# 查询书名包含'湖'的图书
# contains 包含
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 3, 5])
# 查询编号大于3的图书
# gt 大于 great 大
# gte 大于等于 e equal 等于
# lt 小于 less than
# lte 小于等于
BookInfo.objects.filter(id__gt=3)
# 查询书籍id不为3的图书
BookInfo.objects.exclude(id__exact=3)
BookInfo.objects.exclude(id=3)
# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year='1980')
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')
# BookInfo.objects.filter(pub_date__gt='1990.1.1') #错误的
###############################F(了解)#####################################
# 两个属性怎么比较 F对象
"""
F对象的语法形式
filter(字段名__运算符=F('字段名'))
"""
from django.db.models import F
# 查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))
# 查询阅读量大于等于评论量2倍的图书
BookInfo.objects.filter(readcount__gte=F('commentcount') * 2)
###############################Q对象(了解)#####################################
# 需要查询id大于2 并且阅读量大于20的书籍
# 方式1
# filter().filter()
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
# 方式2
# filter(条件,条件)
BookInfo.objects.filter(id__gt=2, readcount__gt=20)
# 需要查询id大于2 或者 阅读量大于20的书籍
from django.db.models import Q
"""
Q(字段名__运算符=值)
或 Q()|Q() ..
并且 Q()&Q() ..
not ~Q()
"""
BookInfo.objects.filter(Q(id__gt=2) | Q(readcount__gt=20))
# 查询书籍id不为3
BookInfo.objects.exclude(id=3)
BookInfo.objects.filter(~Q(id=3))
###############################聚合函数(了解)#####################################
"""
Sum,Max,Min,Avg,Count
聚合函数需要使用 aggregate
语法形式是: aggragte(Xxx('字段'))
"""
# 当前数据的阅读总量
from django.db.models import Sum, Avg, Max, Min, Count
BookInfo.objects.aggregate(Sum('readcount'))
###############################排序#####################################
# 默认升序
BookInfo.objects.all().order_by('readcount')
# 降序
BookInfo.objects.all().order_by('-readcount')
###############################关联查询#####################################
"""
书籍和人物的关系是 1:n
书籍 中没有任何关于人物的字段
人物 中有关于书籍的字段 book 外键
语法形式
通过书籍查询人物信息( 已知 主表数据,关联查询从表数据)
主表模型(实例对象).关联模型类名小写_set.all()
通过人物查询书籍信息( 已知 从表数据,关联查询主表数据)
从表模型(实例对象).外键
查询书籍为1的所有人物信息
查询人物为1的书籍信息
"""
# 查询书籍为1的所有人物信息
# 通过书籍 查询人物
# 1.查询书籍
book = BookInfo.objects.get(id=1)
# 2.根据书籍关联人物信息
book.peopleinfo_set.all()
# 查询人物为1的书籍信息
# 根据书籍 查询人物
from book.models import PeopleInfo
# 1.查询人物
person = PeopleInfo.objects.get(id=1)
# 2.根据人物关联查询书籍
# person.book 实例对象
person.book
person.book.name
###############################关联查询的筛选#####################################
"""
书籍和人物的关系是 1:n
书籍 中没有任何关于人物的字段 (不要考虑隐藏的哪个字段)
人物 中有关于书籍的字段 book 外键
语法形式
我们需要的是 书籍信息,已知条件是 人物信息
我们需要的是 主表数据,已知条件是 从表信息
filter(关联模型类名小写__字段__运算符=值)
我们需要的是 人物信息,已知条件是 书籍信息
我们需要是是 从表数据,已知条件是 主表信息
filter(外键__字段__运算符=值)
"""
"""
查询图书,要求图书人物为"郭靖"
查询图书,要求图书中人物的描述包含"八"
"""
# 需要的是图书,条件是人物
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')
BookInfo.objects.filter(peopleinfo__description__contains='八')
"""
查询书名为“天龙八部”的所有人物
查询图书阅读量大于50的所有人物
"""
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__name__exact='天龙八部')
PeopleInfo.objects.filter(book__readcount__gt=50)
# 射雕,雪山
###############################查询集#####################################
[book.id for book in BookInfo.objects.all()]
#
a = '100'
# 优化一下
books = BookInfo.objects.all()
[book.id for book in books]
[book.id for book in books]
[book.id for book in books]
#######################分页##############################
from django.core.paginator import Paginator
books = BookInfo.objects.all()
# object_list 结果集 /列表
# per_page 每页多少条记录
# object_list, per_page
p = Paginator(books, 2)
# 获取第几页的数据
books_page = p.page(1)