添加记录
from django.shortcuts import render, HttpResponse
from app01.models import Book
def index(request):
# 添加表结构 两种方式
# 1、直接实例化对象(引入定义类)
# sql表对应类,记录对应类实例化对象,字段对应对象的属性
book_obj=Book(id=1,title='python',price=100,pub_date="2012-1-1",publish='出版社')
book_obj.save() # 保存一下,浏览器输入index路径,生成记录
# 方式二:每个模型表下都有objects管理器,进行增删改查
book_obj=Book.objects.create(id=2,title='linux',price=100,pub_date="2012-1-1",publish='出版社')
# create有返回值,返回对象可以打印属性
print(book_obj.price)
return HttpResponse('ok')
查询
查询有很多方法,一定要注意,查询方法的返回值,以及谁来调用方法。再次强调下,一个表就是一个类,一条记录就是类的实例化对象object,
每个模型表下都有objects管理器,封装了所有的方法进行增删改查。
def index(request):
# 1. all 方法
# 调用者 Book.objects
# 返回值 queryset 对象,可以理解为列表,里面放着model对象
book_list = Book.objects.all()
print(book_list)
# <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]>
# 打印的是所有记录,可以在类book里定义str,指定打印内容。
for obj in book_list:
print(obj.title,obj.price)
# python红宝书 100.00
# go 100.00
# linux 80.00
print(book_list[1].title) # go
# 2. first last
# 调用者 queryset 对象,Book.objects.all()
# 返回值 model对象
# 不是这个!book = Book.objects.first()
book = Book.objects.all().first()
print(book) # Book object (1)
print(Book.objects.all()[0]) # Book object (1)
print(Book.objects.all().last()) # Book object (3)
# 3. filter 过滤
# 调用者:Book.objects
# 返回值 queryset对象
book_list = Book.objects.filter(price=100)
print(book_list)
# <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
# 可以结合first,last用
print(Book.objects.filter(price=100).first()) # Book object (1)
# 可以写多个条件
print(Book.objects.filter(title='go',price=100)) # <QuerySet [<Book: go>]>
# 4. get
# 有且只有一个查询结果时 才有意义,查不到报错,多个结果也报错
# 调用者 Book.objects
# 返回值:model 对象
# get(条件)
book_obj = Book.objects.get(title='linux')
print(book_obj) # linux Book object (3)
# book_obj = Book.objects.get(price=100)
# get()报错: returned more than one Book -- it returned 2!
# 5. exclude 排除条件
# 调用者 Book.objects
# 返回值 queryset
ret = Book.objects.exclude(title='go')
print(ret) # <QuerySet [<Book: python红宝书>, <Book: linux>]>
# 6. order_by 排序
# 调用者 queryset
# 返回值 queryset
# 可以链式操作
ret = Book.objects.all().order_by('id') # 默认按id 升序
print(ret) # <QuerySet [<Book: python红宝书>, <Book: go>, <Book: linux>]>
ret = Book.objects.all().order_by('-id') # 降序
print(ret) # <QuerySet [<Book: linux>, <Book: go>, <Book: python红宝书>]>
ret = Book.objects.all().order_by('price','id') # price asc 相等 按id asc
# 7. reverse 反转
ret = Book.objects.all().order_by('id').reverse()
print(ret) # <QuerySet [<Book: linux>, <Book: go>, <Book: python红宝书>]>
# 8. count
# 调用者 queryset
# 返回值 int
ret = Book.objects.all().count()
print(ret) # 3
# 9. exists
#调用者 queryset
#返回值 true false
#
ret = Book.objects.all().exists()
if ret: # True
print(ret)
#重点:
# 10. values 查询指定字段得数据
#调用者 queryset
#返回值 queryset ,里面放着字典
'''
value的原理:values(price,title):
temp=[]
for obj in Book.objects.all()
temp.append({
"price"=obj.price
"title"=obj.title
})
return temp
'''
ret = Book.objects.all().values('price')
print(ret)
# <QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('100.00')}, {'price': Decimal('80.00')}]>
print(ret[0].get("price")) # 100.00
ret = Book.objects.all().values('price','title')
print(ret)
# <QuerySet [{'price': Decimal('100.00'), 'title': 'python红宝书'}, {'price': Decimal('100.00'), 'title': 'go'}, {'price': Decimal('80.00'), 'title': 'linux'}]>
# 不加all也可以,不建议。
ret = Book.objects.values('title') # 相当于 all().values()
print(ret)
# <QuerySet [{'title': 'go'}, {'title': 'linux'}, {'title': 'python红宝书'}]>
print(ret[0].get('title')) # go
# 字典使用 .get 方法,没有数据时 不会报错
# 11 values_list
# 调用者 queryset
# 返回值 queryset 里面放着元祖
ret = Book.objects.all().values_list('price')
# <QuerySet [(Decimal('100.00'),), (Decimal('100.00'),), (Decimal('80.00'),)]>
ret = Book.objects.all().values_list('price','title')
# <QuerySet [(Decimal('100.00'), 'python红宝书'), (Decimal('100.00'), 'go'), (Decimal('80.00'), 'linux')]>
# 12 distinct 去重
#调用者 queryset
#返回者 quertset
# 配合着values() values_list()使用
ret = Book.objects.all().values('price').distinct() # 实现了 去重
print(ret)
# <QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('80.00')}]>
# 链式操作
Book.objects.all().filter().order_by().filter().reverse().first()
return HttpResponse('OK')
总结
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序
<6> reverse(): 对查询结果反向排序
<7> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<8> first(): 返回第一条记录
<9> last(): 返回最后一条记录
<10> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<11> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列
<12> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct(): 从返回结果中剔除重复纪录
基于双下划线模糊查询
def index(request):
# 1. 大于 小于 100 > x > 50
ret = Book.objects.filter(price__gt = 50,price__lt = 100)
# 2.以什么开头
ret = Book.objects.filter(title__startswith='py')
print(ret) # <QuerySet [<Book: python红宝书>]>
# 3.包含什么
# 大小写敏感
ret = Book.objects.filter(title__contains='o')
print(ret) # <QuerySet [<Book: python红宝书>, <Book: go>]>
# 大小写不敏感
ret = Book.objects.filter(title__icontains='O')
print(ret)
# <QuerySet [<Book: python红宝书>, <Book: go>, <Book: linuxO>]>
# 4.在什么里面,或的关系,不是区间,100,或200,或50
ret = Book.objects.filter(price__in=[100,200,50])
# 5. 在什么范围内 100 >= x >= 50
ret = Book.objects.filter(price__range = [50,100])
# 6.在哪一年 哪一月,只有date类型才可以。
ret = Book.objects.filter(pub_date__year=2018)
ret = Book.objects.filter(pub_date__year=2018,pub_date__month=3)
print(ret) # <QuerySet []>
return HttpResponse('OK')
删除,修改
先查到这个记录再修改或者删除
def index(request):
# 1 删除 delete()
# 调用者 queryset 符合条件的全部删除
# 返回者 元祖
ret = Book.objects.filter(price=50).delete()
print(ret) # (1, {'book.Book': 1}) 删除的个数,所属表,一般不用返回值。
# 2 删除
# 调用者 model 对象 精确找到某条记录之后删除
# 返回者 元祖
ret = Book.objects.filter(price=100).first().delete()
print(ret) # (1, {'book.Book': 1})
# 3 修改 update()
# 调用者 queryset
# 返回者 int
# 只能是queryset调用,model 不能调 update
# ret = Book.objects.filter(title='linux').update(title='linux_go')
ret = Book.objects.filter(price=100).update(title='lin')
print(ret) # 0 / 1 / 2
# model 不能调 update
ret = Book.objects.filter(price=80).first().update(title='liliaa')
print(ret) # 'Book' object has no attribute 'update'
return HttpResponse('OK')