ORM单表操作

编辑本博客

添加表记录

注:创建数据库必须用utf8编码,避免中文报错

create database orm default charset=utf8;
View Code

方式一、实例化对象

实例化一个对象

new_boot=Book(id=1,
             title='python宝典',
             price=100,
             pub_date="2018-07-05",
             publish="人民日报"
             )
View Code

保存

new_boot.save()
View Code

批量插入数据,通过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)
View Code

方式二、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)
View Code

数据库中对应的数据

查询表记录

  1. 方法的返回值
  2. 方法的调用者

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对象,对象中放元祖,字典
View Code
  • 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的书籍
View Code
  • __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;
View Code

ORM:

Emp.objects.values("dep").annotate(avg_salary=Avg('salary'))
View Code

需求二:每个身份员工数

ORM:

Emp.objects.values("province").annotate(count=Count("id"))
View Code

补充知识:

  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()
View Code

修改表记录

update(),返回修改数目,只能由QuerySet来调用

ret = Book.objects.filter(title='python').update(title="Python")
View Code

 

posted @ 2018-07-05 16:01  丫丫625202  阅读(214)  评论(0编辑  收藏  举报