• 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
  • 相关阅读:
    面向对象基础
    VmWare下安装CentOS6图文安装教程
    设计模式培训之一:为什么要用单例模式?
    CentOS5.4下安装和配置Apache、PHP、MySql、PHPMyAdmin
    WEB架构师成长系列索引
    WEB架构师成长之路之三架构师都要懂哪些知识
    设计模式培训之三:抽象工厂
    IOS6屏幕自动旋转设置测试
    设计模式培训之二:简单工厂、工厂方法
    QT和Oracle连接的oci驱动的编译
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9268831.html
Copyright © 2020-2023  润新知