单表操作
django 自带的sqlite3数据库对日期格式不是很敏感,处理的时候容易出错。
测试脚本
测试环境准备:去manage.py 中拷贝钱四行代码,然后自己手写两行。
脚本无论在引用下面,还是单独开设PY文件都可以。
import os
import sysif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysiteday62.settings")#手写2行import djangodjango.setup()#所有代码都必须在下面,包括import命令from app01 import models#不需要迁移命令#增user_obj=models.User(username=username,password=password)User_obj.save() #保存数据#删除 models.Book.objects.filter(pk=2).delete()#pk会自动查找当前表的主键字段#用了PK,不需要查看主键字段名字 uid pid sid...#第二种usr_obj=models.Book.objects.filter(pk=2)usr_obj.delete()#修改#get 不推荐,没有数值会报错edit_book_obj = models.Book.objects.get(pk=edit_id)#推荐models.Book.objects.filter(pk=edit_id).update(book_title=new_title ,publisher=new_publisher_id )
必知的13条
1.all()
2.filter() 可以主键用pk替代
3.get() 直接拿数据,但条件不存在会报错。
4.first()
5.last()6.values() #指定获取的数据的字段。返回结果列表套字典res=models.User.objects.values('name','age')7. values_list() #返回列表套元组res.query 查看sql语句方式,只有queryset对象才行8.distinct() 去重复,有主键不能去除,一定要一模一样的数据,一定不要忽略主键9. order_by()
res=models.User.objects.order_by('age') 默认升序
res=models.User.objects.order_by('-age') #降序 加‘-’10. reverse() 反转,前提是 数据已经排序,跟在order_by()11. count() #统计个数12. exclude() #排除在外
res=models.User.objects.exclude(name='jason')13. exists() #是否存在,返回布尔值. 基本用不到,数据包含布尔值。
神器的双下划线查询
#查询小于35岁
res=models.User.objects.filter(age__lt=35)#小于等于
res=models.User.objects.filter(age__lte=30)#年龄18,或者32,或者40
res=models.User.objects.filter(age__in=[18,32,40])#18到40岁
res=models.User.objects.filter(age__range=[18,40])#名字还有“n”,默认区分大小写res=models.User.objects.filter(name__contains='n')#忽略大小写
res=models.User.objects.filter(name__icontains='n')#开头,结尾
res=models.User.objects.filter(name__startswith='n')
res=models.User.objects.filter(name__endswith='n')#注册时间2020 1月份
res=models.User.objects.filter(register_time__month='1')
res=models.User.objects.filter(register_time__year'2020')ret = models.Person.objects.filter(birthday__year=2000, birthday__month=5)
多表操作
一对多
#增
#1.直接字段 id
models.Books.objects.create(tittle='sanguo',price=123.23,pblicsh_id=1)#2.虚拟字段,对象
publish_obj=models.Publish.objects.filter(pk=2),first()
models.Books.objects.create(tittle='sanguo',price=123.23,pblicsh=publish_obj)#删除,默认级联,删了一个,另外关联表也删除。
models.Publish.objects.filter(pk=1).delete()#修改#1
models.Books.objects.filter(pk=1).update(publish_id=2)#2
publish_obj=models.Publish.objects.filter(pk=2),first()
models.Books.objects.filter(pk=1).update(publish=publish_obj)
多对多
# 多对多 增删改查 就是在操作第三张表#book与authors 多对多#-----增--------
book_obj=models.Book.objects.filter(pk=1).first()
#主键为1的书籍,添加一个主键为1的作者
book_obj.authors.add(1) #因为多对多,可以添加多个。
book_obj.authors.add(2,3) #方法二
author_obj1=models.Author.objects.filter(pk=1),first()
author_obj2=models.Author.objects.filter(pk=2),first()
author_obj3=models.Author.objects.filter(pk=3),first()
book_obj.authors.add(author_obj1,author_obj2,author_obj3) add给第三张表添加数据,可以数字也可以对象。#--------删-----------book_obj.authors.remove(2)
book_obj.authors.remove(1,3)#同样支持对象
book_obj.authors.remove(author_obj1,author_obj2)#------------修改-----------book_obj.authors.set([1,3])
book_obj.authors.set([3]) #也支持对象#括号内必须是,可迭代对象。#**先删除,后新增#-------清空----------#在第三张表,清空某个书籍,与作者关系book_obj.authors.clear()
#不需要参数。
多表查询
正反向概念
外键字段在book
book->publish 正向
publish->book 反向
口诀:
正向查找靠字段 :
反向查找靠小写 (结果为多个加_set, . 单个不用)
(结果为多个的时候,需要.all())
子查询(基于对象的跨表查询)
#1.查询书籍主键为1的出版社
book_obj=models.Book.objects.filter(pk=1),first()
#正向
res=book_obj.publish
print(res.name)#2. 查询书籍主键为2的作者
book_obj=models.Book.objects.filter(pk=2),first()
#正向
res=book_obj.authors.all() #3. 查询作者jason的电话号码
author_obj=models.Author.objects.filter(name='jason').first()
res=author_obj.author_detail
print(res.phone)什么时候加.all()
结果为多个加.all()#4.查询出版社为东方出版社的书
publish_obj=models.Publis.objects.filter(name='东方出版社').first()
#反向, 表名小写 加_set
res=publish_obj.book_set.all()#5. 查询作者为jason的书
author_obj=models.Author.objects.filter(name='jason')
res=author_obj.book_set.all()
print(res)#6. 查询手机号为110的作者姓名
author_detail_obj=models.AuthorDetail.objects.filter(phone=110).first()
res=auther_detail_obj.author
print(res.name)#***但结果为单个,就不用_set
基于双下划线跨表查询
#1.查询jason的手机号和名字
res=models.Author.objects.filter(name='jason').values('author_detail__phone','name')#反向
res=models.AuthorDetail.objects.filter(author__name='jason').values('phone',author__name)#2. 查询主键为1的出版社名字和书的名字
res=models.Book.objects.filter(pk=1).values('title','publish__name') #表名小写
#反向
res=models.Publish.objects.filter(book__id=1).valus('name','book__title')#3. 查询书籍主键为1的作者姓名
res=models.Book.objects.filter(pk=1).value('authors__name')
res=models.Author.objects.filter(book__id=1),values('name')#4. 书籍主键1的作者的手机号
res=models.Book.objects.filter(pk=1),values('authors__author_detail__phone')