单表操作 数据:增,查,删,改
增加记录
# *********增********* # 第一种方式 注意时间格式 推荐第一种 # import datetime # now = datetime.datetime.now() # book = Book.objects.create(name='红楼梦',price=10,pub_date='2018-01-01',author='xjj',publish='北京出版社') # Book.objects.create(name='西游记',price=20,pub_date=now,author='egon',publish='上海出版社') # 第二种方式 # book1 = Book(name='水浒传',price=30,pub_date='2018-01-02',author='lqa',publish='广州出版社') # book1.save() # # print(now) #2018-09-07 20:35:21.296465 # print(book) #Book object # print(book1) #Book object
查找记录
# *********查********* # filter(--queryset对象)相当于sql的where 后面传的参数,都是and # books = Book.objects.filter(name='红楼梦') # print(books) #<QuerySet [<Book: Book object>]> # print(books.first()) #Book object # print(books.first().id) #1 # print(books[0].id) #1 # all() 拿所有的--queryset对象 # books = Book.objects.all() # print(books) #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # first() 从queryset里取出第一个值---->book对象 # books = Book.objects.all().first() # print(books) #Book object # last() # books = Book.objects.all().last() # print(books) #Book object # Book.objects.all()[-1] #报错 # get只能用来查,返回一条数据的情况,多,少,都报错 用于属性是unique属性字段的 # books = Book.objects.get(name='西游记') # print(books) #Book object # values 对应到sql相当于 selet 这里的东西 from book---返回QuerySet对象 # 一旦返回是queryset对象,可以继续点它的方法 # book=Book.objects.all().values('name','price').filter(name='Pyhon开发').filter(id=4).values('id') # books = Book.objects.all().values('name','price').first() # print(books) #{'name': '红楼梦', 'price': Decimal('10.00')} # values_list 对比values values_list:queryset里放元组, values:queryset里放字典 # books = Book.objects.all().values_list('name','price') # print(books) #<QuerySet [('红楼梦', Decimal('10.00')), ('西游记', Decimal('20.00')), ('水浒传', Decimal('30.00'))]> # exclude 除XX以外的 # books = Book.objects.all().exclude(name='西游记') # print(books) #<QuerySet [<Book: Book object>, <Book: Book object>]> # order_by 默认从小到大,想从大到小- # books = Book.objects.all().order_by('price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # books = Book.objects.all().order_by('-price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # print(books) # count 返回数值---不能继续点了 # count = Book.objects.all().count() # print(count) #3 # exists 判断queryset里有没有数据,没有就是false,有就是true # res=Book.objects.all().exists() # print(res) #True # distinct() 去重复 # res = Book.objects.values('publish').distinct() # print(res) #<QuerySet [{'publish': '北京出版社'}, {'publish': '上海出版社'}, {'publish': '广州出版社'}]> # 这种无意义,因为每条记录对象都不同 最起码id不同 # res = Book.objects.all().distinct() # print(res) #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # reverse 对查询结果反向排序 只能和order_by连用 # books = Book.objects.all().order_by('-price').reverse() #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # 相当于 # books = Book.objects.all().order_by('price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> # books = Book.objects.all().order_by('-price','pub_date').reverse() # 相当于 # books = Book.objects.all().order_by('price','-pub_date') # print(books) return HttpResponse('ok') ''' <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id') <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录 补充:链式调用,定义类返回自己 '''
基于双下划线的模糊查询
#基于双下划线的模糊查询 #类比sql原生的like # 不连续范围 Book.objects.filter(price__in=[100,200,300]) # 连续范围 Book.objects.filter(price__range=[100,200]) # 大于等于和小于等于 Book.objects.filter(price__gt=100) Book.objects.filter(price__lt=100) Book.objects.filter(price__gte=100) Book.objects.filter(price__lte=100) # 包含xx icontains不区分大小写 Book.objects.filter(title__contains="python") Book.objects.filter(title__icontains="python") # 以xx开头 以xx结尾 Book.objects.filter(title__startswith="py") Book.objects.filter(title__endswith="py") # 把日期截断取值比较 Book.objects.filter(pub_date__year__gt=2012) Book.objects.filter(pub_date__month=12) Book.objects.filter(pub_date__day=12) 补充:大于等于并且小于等于 # ret1=Book.objects.filter(price__range=[1,100]) # ret2 = Book.objects.filter(price__gte=1,price__lte=100)
更新数据 update()
# 更新 修改表记录 update() # 更新 返回结果是int类型,只能queryset对象来调,对象不能来调
# ret=Book.objects.all().filter(price=51) # ret=Book.objects.all().filter(price=51).update(name='后楼梦') 可以 # ret=Book.objects.all().filter(price=51).first() 不行 # ret.update(name='水浒传') # print(ret)
删除数据 delete()
# 删除 生产环境一般不删除 # 对象和queryset 都可以删除 返回值也一样
# ret=Book.objects.filter(name='水浒传').delete() # ret=Book.objects.filter(name='红楼梦').first().delete() # (1, {'app01.Book': 1}) 1 影响一条记录 那个表的记录 1 影响这个表的记录 # print(ret) # 这不可以 manager对象 # ret=Book.objects.delete() # 这个可以 # ret=Book.objects.all().delete()
django终端打印sql语句
settings中追加即可
ps:print(ret.query) queryset对象的query方法,也可以打印原生sql
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
python脚本中调用django环境
views中设置
一般模式:浏览器请求,查看服务端
改进版:直接右键运行,学习阶段使用,以后不会使用,了解
# 这样就不用启动django了,在浏览器访问,在看打印内容
# 直接右键运行即可,单表,多表操作快一些
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangotest08.settings") #settings中复制过来
import django #导入django
django.setup() #启动django
# from app01 import models #导入模型
from app01.models import * #导入模型
# books = models.Book.objects.all() #sql语句部分
# print(books)
练习:
# 查询老男孩出版社出版过的价格大于200的书籍 # 查询2017年8月出版的所有以py开头的书籍名称 # 查询价格为50, 100或者150的所有书籍名称及其出版社名称 # 查询价格在100到200之间的所有书籍名称及其价格 # 查询所有人民出版社出版的书籍的价格(从高到低排序,去重) ret = Book.objects.filter(publish='老男孩出版社',price__gt=200) ret = Book.objects.filter(price__contains='2017-08',name__startswith='py') ret = Book.objects.filter(price__in=[50,100,150]).values('name','publish') ret = Book.objects.filter(price__range=[100,200]).values('name','price') ret = Book.objects.filter(publish='人民出版社').values('price').order_by('price').reverse().distinct()