目录python
Django测试环境搭建:拷贝manage.py中的行代码放到tests.py文件中导入模块sql
import django`,`django.setup()
若是你想查看orm语句内部真正的sql语句有2种方法:django
1.若是是queryset对象,就能够.query查看该queryset对象的内部sql语句json
2.在settings.py
文件中配置测试
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, }}
增code
models.Book.objects.create(title = '三国演义',price = 12.22)
book_obj = models.Book(title='三国演义',price='12.22') book_obj.save()
删orm
models.Book.objects.filter(pk=2).delete()
改对象
models.Book.objects.filter(pk=2).update(title = '红楼梦',price = 22.22)
查blog
res = models.Book.objects.filter(pk=2)
all():查全部,查询结果为Queryset对象排序
res = models.Book.objects.all() print(res)
filter:查询结果为Queryset对象
res = models.Book.objects.filter(pk=2)
get():查询结果为数据对象自己,和filter查询类似,不推荐使用
res = models.Book.objects.get(pk=2)
first():查询第一个
res = models.Book.objects.first()
last():查询最后一个
res = models.Book.objects.last() #res能够.title,.price
exclude():哪个排除以外
res = models.Book.objects.exclude(pk=3)
values():查询结果为列表套字典的Queryset对象
res = models.Book.objects.values('title')
value_list():查询结果为列表套元组的Queryset对象
res = models.Book.objects.values_list('title')
count():统计数据的条数
res = models.Book.objects.count('title') res = models.Book.objects.all.count('title')
distinct():数据必须是如出一辙的状况下去重
res = models.Book.objects.distinct() #无变化 res = models.Book.objects.values('title').distinct()
order_by():排序
res = models.Book.objects.order_by('price') #默认升序 res = models.Book.objects.order_by('-price') #降序
reverse():排序后反转(才有意义)
res = models.Book.objects.reverse()
exists():是否存在
models.Book.objects.filter(pk=1).exists()
查询价格大于200的书籍
models.Book.objects.filter(price__gt=200)
查询价格小于200的书籍
models.Book.objects.filter(price__lt=200)
查询价格大于等于200的书籍
models.Book.objects.filter(price__gte=200)
查询价格小于等于200的书籍
models.Book.objects.filter(price__lte=200)
查询价格是200元或者300元的书籍
res = models.Book.objects.filter(price__in=[200,300])
查询价格是200到500元之间的书籍
res = models.Book.objects.filter(price__range=(200,500)) #顾头不顾尾
查询书籍中包含p的书籍
res = models.Book.objects.filter(title__contains='p') #区分大小写 res = models.Book.objects.filter(title__icontains='p') #不区分大小写
查询书籍名称是以三开头的书籍
res = models.Book.objects.filter(title__startswith="三")
查询书籍名称是以三结尾的书籍
res = models.Book.objects.filter(title__endswith="三")
查询出版日期是2019年的书籍
res = models.Book.objects.filter(data__year="2019")
查询出版日期是10月份的书籍
res = models.Book.objects.filter(data__month="10")
增
models.Book.objects.create(title='xxx',price=66.66,publish_id=1)
publish_obj =models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title='xxx',price=66.66, publish_id=publish_obj)
查
book_obj = models.Book.objects.filter(pk=1).first() print(book_obj.publish.name) print(book_obj.publish_id)
改
models.Book.objects.filter(pk=3).update(publish_id=3)
publish_obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.filter(pk=3).update(publish_id=publish_obj) #给书更换出版社
删
models.Book.objects.filter(pk=3).delete()
增
book_obj = models.Book.objects.filter(pk=3).first() print(book_obj.author) # 就至关于已经到书籍与做者的关系表中 book_obj.author.add(1) book_obj.author.add(2, 3) # 还能够添加多个值 author_obj = models.Author.objects.filter(pk=1).first() book_obj.author.add(author_obj) author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.add(author_obj, author_obj1) # 还能够添加多个值 ''' add() 括号内 既能够串数字,也能够传对象 而且支持传多个 可是括号内必须是可迭代对象 '''
删
#方式一 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.remove(2) book_obj.author.remove(1,2) #方式二 author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.remove((author_obj, author_obj1)) ''' remove() 括号内 既能够串数字,也能够传对象 而且支持传多个 ''' #清空 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.clear() '''clear括号内不须要传任何参数 直接清空当前书籍对象全部的记录'''
改
#方式一 book_obj = models.Book.objects.filter(pk=3).first() book_obj.author.set([3, ]) #方式二 author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.author.set((author_obj, author_obj1)) ''' set() 括号内 既能够串数字,也能够传对象 而且支持传多个 可是括号内必须是可迭代对象 '''
查
当该字段所对应的数据有多个的时候 须要加.all( )
,不然点外键字段直接就可以拿到数据对象
查询书籍是Python入门的出版社名称(一对多)
book_obj = models.Book.objects.filter(title='python入门').first() print(book_obj.publish.name) print(book_obj.publish.addr)
查询书籍主键为6的做者姓名(多对多)
book_obj = models.Book.objects.filter(pk=6).first() print(book_obj.author) #None print(book_obj.author.all()) #拿到当前这本书全部的做者
查询做者是Jason的手机号(一对一)
author_obj = models.Author.objects.filter(name='jason').first() print(author_obj.author_detail.phone)
查询出版社是东方出版社出版过的书籍
publish_obj = models.Publish.objects.filter(name="东方出版社").first() print(publish_obj.book_set.all())
查询做者是Jason写过的全部的书
author_obj = models.Author.objects.filter(name='json').first() print(author_obj.book_set.all())
查询手机号是110的做者
phone_obj = models.AuthorDetail.objects.filter(phone=110).first() print(phone_obj.author)
查询书籍是Python入门的出版社名称
正向:
models.Book.objects.filter(name='python入门').values('publish__name')
反向:
models.Publish.objects.filter(book__title='python入门').value('name')
查询做者是jason的手机号码
正向:
models.Author.objects.filter(name='json').values('author_detail__phone')
反向
models.AuthorDetail.objects.filter(author__book__author='json').values('phone','author_age') #还能够加本身的年龄
查询手机号是120的做者姓名和地址
正向
models.AuthorDetail.objects.filter(phone='120').values('author__name')
反向
models.Author.objects.filter(author_detail__phone=120).values('name',,'author_detail__addr')
查询出版社是东方出版社出版的书籍名称
正向:
models.Publish.objects.filter(name='东方出版社').values('book__title')
反向:
models.Book.objects.filter(author__book__publish='东方出版社').values('title')
查询做者是jason的写过的书的名字和价格
正向:
models.Author.objects.filter(name='json').values('book__title','book__price')
反向:
models.Book.objects.filter(author__name='json').values('title','price')
查询书籍是python入门的做者的手机号
正向:
models.Book.objects.filter(name='python入门').values('authors__author_detail__phone')
反向:
models.AuthorDetail.objects.filter(author__book__title='python入门').values('phone')
auto_now:每次修改数据的时候,都会自动更新时间
auto_now_add:在建立数据的时候,会自动将当前时间记录下来,后期若是你不人为修改的话,数据不变
queryset:只要是queryset对象就能够无限的点queryset对象的方法
eg:一步步筛选
queryset.excult(pk=1).filter(pk=3).filter(pk=4)
return:return返回的必须是字符串,其余的类型直接报错,此处能够写在models.py中。
书籍对象查出版社 外键字段在书籍 正向查询
出版社查书籍 外键字段在书籍 反向查询
注意:计算机语言是基于英语语境开发的语言,因此能够用英语的语法角度出发理解,没必要太中式思考。不管是正向仍是反向查询,只须要按着你想查找的结果为最终目的去运用命令,能够轻松理解查询这一块的知识。