ORM单表操作
添加表记录
注:创建数据库必须用utf8编码,避免中文报错
create database orm default charset=utf8;
方式一、实例化对象
实例化一个对象
new_boot=Book(id=1, title='python宝典', price=100, pub_date="2018-07-05", publish="人民日报" )
保存
new_boot.save()
批量插入数据,通过objects.bulk_create()方法
book_list=[] for i in range(1000): book=Book(title="book_%s" % i,price=i*i) book_list.append(book) Book.objects.bulk_create(book_list)
方式二、objects方法
返回值为当前生成的数据记录,可通过属性操作查看相应数据。create无需再调用save方法
new_book=Book.objects.create( title='javascript宝典', price=180, pub_date="2018-07-05", publish="天津出版社" ) print(new_book.title) print(new_book.price) print(new_book.pub_date)
数据库中对应的数据
查询表记录
- 方法的返回值
- 方法的调用者
model中添加一个__str__方法,返回一个字符串
Book.objects方法
查询API
#查询表记录 book_list=Book.objects.all()#查询所有记录 first_book=Book.objects.all().first()#返回去第一条记录,类似Book.objects.all()[0] last_book=Book.objects.all().last()#返回去第一条记录Book.objects.all()[-1] book_list=Book.objects.filter(title="javascript宝典",price=100)#filter条件过滤,多个条件and关系 book_obj=Book.objects.get(title="javascript宝典")#有且只有一个查询结果时才有意义,否则报错 book_list=Book.objects.exclude(price=100)#过滤价格不等于100的对象 book_list = Book.objects.all().order_by("price",'-title')#对查询结果进行排序,Book.objects.all().order_by("-price")降序 book_titles=Book.objects.all().values("title")#返回一个QuerySet对象,对象中放字典,非对象 book_titles=Book.objects.all().values_list("title")#返回一个QuerySet对象,对象中放元祖,字典
- all():查询所有结果,返回QuerySet对象
- filter(**kwargs):查询筛选给定条件相匹配的对象,返回QuerySet对象。可以同时添加多个条件。
- get(**kwargs):查询给定条件相匹配的对象,如果符合条件的有多条记录,则报错。返回的结果有且只有一个。返回一个model对象
- exclude(**kwargs):筛选给定条件不匹配的对象,返回QuerySet对象
- order_by(*field):对查询结果排序,用在QuerySet对象上。默认按id排序。参数前面添加“-”,则降序排序。排序可组合排序,添加多个字段。
- reverse():对查询结果反向排序,用于QuerySet对象上
- count():返回匹配查询的对象数量,用于QuerySet对象上,返回int类型
- first():返回第一条记录,返回一个模型对象,在QuerySet上使用
- last():返回最后一条记录,返回一个模型对象,在QuerySet上使用
- exists():有查询到数据,返回True,否则返回FALSE。用于QuerySet对象上
- values(*field):作用在QuerySet上,返回一个QuerySet对象,对象中放字典,非对象
- values_list(*field):和values()类似,返回一个QuerySet对象,对象中放元祖,非字典
- distinct():从返回结果中剔除重复记录,作用于QuerySet上,但是在all()上无意义。一般用于values和values_list后面
- extra(),某些情况下,django的查询语句难以表达复杂的where语句,提供extra()方法对QuerySet进行修改。作用于QuerySet上
模糊查询
过滤条件后面添加
ret=Book.objects.filter(price__gt=10)#价格大于10的书籍 ret=Book.objects.filter(price__lt=10)#价格小于100的书籍 ret=Book.objects.filter(price__in=[10,20,30])#价格在列表中 ret=Book.objects.filter(price_gt=10,price__lt=100)#价格在10-100之间的书籍 ret=Book.objects.filter(price_range=[10.100])#价格在10-100之间的书籍 ret = Book.objects.filter(titme__startswitch="py") # 标题以py开头的书籍 ret = Book.objects.filter(titme__contains="j") # 标题包含j的书籍,区分大小写 ret = Book.objects.filter(titme__icontains="j") # 标题包含j的书籍,不区分大小写 ret=Book.objects.filter(pub_date__year=2018)#查找2018的书籍
- __gt:大于
- __lt:小于
- __in:在列表中
- __range:区间
- __startswitch:以什么开头
- __contains:包含,区分大小写
- __icontains:包含,不区分大小写
- __year:查找日期类型的年
分组查询
单表下按主键group by没有任何意义,即不能用.all().annotate()
语法:单表模型.objects.values('group by的字段').annotate(聚合函数(“统计字段”))
需求一:查询每一个部门的名称以及员工平均薪水
SQL:
SELECT COUNT(id) FROM emp GROUP BY dep;
ORM:
Emp.objects.values("dep").annotate(avg_salary=Avg('salary'))
需求二:每个身份员工数
ORM:
Emp.objects.values("province").annotate(count=Count("id"))
补充知识:
Emp.objects.all() --> select * from emp
Emp.objects.values("name") --> select name from emp
删除表记录
update()
方法一、先查询出来后再调用delete()方法,作用于QuerySet对象上,返回删除的记录数
方法二、在具体某个model对象上调用delete()方法
ret=Book.objects.filter(title__contains='python').delete() #作用于model对象上 Book.objects.filter(price=100).first().delete()
修改表记录
update(),返回修改数目,只能由QuerySet来调用
ret = Book.objects.filter(title='python').update(title="Python")