django 数据库查询 ORM

单表操作:

  添加记录:

 # 方式1:
            #obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100)

               注意:Book.objects.create()的返回值是当前添加的记录对象这种方式不需要save()
            # 方式2:
            book_obj=Book(title="python2",publishDate="2012-12-12",price=100)
            book_obj.save()

  查询记录:(数据类型:QuerySet)   [...,...,]

<1> all():                 查询所有结果
            <2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
            <3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                                       如果符合筛选条件的对象超过一个或者没有都会抛出错误。
            <5> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象     

            <4> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                                       model的实例化对象,而是一个可迭代的字典序列
            <9> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

            <6> order_by(*field):      对查询结果排序

            <7> reverse():             对查询结果反向排序

            <8> distinct():            从返回结果中剔除重复纪录

            <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。

            <11> first():              返回第一条记录

            <12> last():               返回最后一条记录

            <13> exists():             如果QuerySet包含数据,就返回True,否则返回False

            双下划线的查询:

                book_list=Book.objects.filter(price__gt=60)
                book_list=Book.objects.filter(price__lt=60)
                book_list=Book.objects.filter(title__contains="py") #这个用于查看是否包含某个数据。
                book_list=Book.objects.filter(title__startswith="python")
                book_list=Book.objects.filter(price__in=[60,70,100])
                book_list=Book.objects.filter(price__range=[50,99])

删除:

删除:
            Book.objects.filter().delete() # 默认级联删除

更新:

Book.objects.filter().update(price=50,.....)

一对多创建:

publish=models.ForeignKey(to="Publish",to_field="id")

多对多创建:

authors=models.ManyToManyField(to="Author")
author=models.OneToOneField("Author")

一对一添加:

            # 方式1:
            #Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)
            # 方式2:
            publish_obj=Publish.objects.filter(name="人民出版社")[0]
            Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish=publish_obj)

多对多添加:

book_authors.objects.create(book_id=1,author_id=2)   

            book_obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2)             

            book_obj.authors.all()

            book_obj.authors.add(obj1,obj2....)
            book_obj.authors.add(*[]) #

            book_obj.authors.remove(obj1,obj2....)
            book_obj.authors.remove(*[])
            book_obj.authors.clear()

批量添加:
        #在插入数据库记录的时候,需要将列表一条条插入数据库,容易造成性能浪费。插入一条记录生成一个sql语句。
    #下方这个解决这个问题。
        models.UserInfo.objects.bulk_create()     #里面是一个列表,这样是生成一个sql语句,将里面的用户全部插入  

基于对象的跨表操作(子查询):

正查询与反查询:

  

一对多: 

        正向查询,按字段:publish
        反向查询,按表名小写_set

        查询:

            查询java这本书的出版社的邮箱

            book_obj=Book.objects.filter(title="java").first()
            book_obj.publish.email
多对多:

        正向查询,按字段:authors
        反向查询,按表名小写_set

        查询:
            book_obj.authors.all()        # 与这本书籍关联的所有作者对象集合
            author_obj.book_set.all()
 一对一:

        添加记录:参考一对多
        查询记录:

            正向查询,按字段:author
            反向查询,按表名小写

基于QuerySet的跨表查询(join查询)

#一对多 publish:与当前书籍对象关联的的出版社对象
    publish=models.ForeignKey(to="Publish",to_field="id")
    #多对多 authors
    authors=models.ManyToManyField(to="Author")
    author=models.OneToOneField("Author")

    正向查询,按字段:publish
    反向查询,按表名小写
一对多:
            例1:
            查询java这本书的出版社的邮箱(正向查询)

            ret=Book.objects.filter(nid__gt=6).values("publish__name")

            sql:
                SELECT "app01_publish"."name"
                FROM "app01_book" INNER JOIN "app01_publish"
                ON ("app01_book"."publish_id" = "app01_publish"."id")
                WHERE "app01_book"."nid" > 6 LIMIT 21;

            values实现机制:
                 对调用的QuerySet集合对象里面的每一个对象循环遍历,取出每一个对象的显示字段的值,组成新的字典,放在一个新的QuerySet中,返回

            例2:
            # 查询人民出版社出版过的所有的书籍名称(反向查询)
            ret=Publish.objects.filter(name="人民出版社").values("book__title")
            print(ret)
            <QuerySet [{‘book__title‘: ‘golang‘}, {‘book__title‘: ‘linux2‘}, {‘book__title‘: ‘qq‘}, {‘book__title‘: ‘www‘}]>
多对多的查询
            # 查询php这本书籍的所有作者的名字以及年龄
            # ret=Book.objects.filter(title="php").values("authors__name","authors__age")
            # print(ret)
            # 查询alex出版社过的所有书籍的名称和价格
            # ret=Author.objects.filter(name="alex").values("book__title","book__price")
            # print(ret)
一对一查询
            # 查询tel=789的作者的名字
            ret=AuthorDetail.objects.filter(tel="789").values("author__name")
            # 查询alex的手机号是多少
            ret=Author.objects.filter(name="alex").values("authordetail__tel")
扩展:
        #查询人民出版社出版过的所有的书籍名称(两种查询思路,基表不同)

        ret=Publish.objects.filter(name="人民出版社").values("book__title")
        ret=Book.objects.filter(publish__name="人民出版社").values("title")

        # 手机号以151开头的作者出版过的所有书籍名称以及出版社名称

        ret=Book.objects.filter(authors__authordetail__tel__startswith="7").values("title","publish__name")
        print(ret)

           SELECT "app01_book"."title", "app01_publish"."name" FROM "app01_book"
           INNER JOIN "app01_book_authors" ON ("app01_book"."nid" = "app01_book_authors"."book_id")
           INNER JOIN "app01_author" ON ("app01_book_authors"."author_id" = "app01_author"."id")
           INNER JOIN "app01_authordetail" ON ("app01_author"."id" = "app01_authordetail"."author_id")
           INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."id")
           WHERE
           "app01_authordetail"."tel" LIKE ‘7%‘ ESCAPE ‘\‘ LIMIT 21; args=(‘7%‘,)

聚合查询与分组查询

ORM:

        # 聚合函数  aggregate
        from django.db.models import Sum,Count,Max,Min,Avg
        # ret=Book.objects.all().aggregate(Sum("price"))
        # print(ret)

        # 分组函数 annotate

        # 查询每一个出版社出版社出版的书籍个数
        # ret=Publish.objects.all().annotate(c=Count("book__title")).values("name","c")
        # print(ret) # <QuerySet [<Publish: 人民出版社>, <Publish: 机械出版社>, <Publish: 北京出版社>]>

        # 查询每一本书的作者个数
        #ret=Book.objects.all().annotate(author_num=Count("authors")).values("author_num","title")
        # ret=Book.objects.all().annotate(author_num=Count("authors")).filter(author_num__gt=0)
        # print(ret)

xxx

原文地址:https://www.cnblogs.com/taozizainali/p/9084857.html

时间: 2024-10-11 04:09:23

django 数据库查询 ORM的相关文章

django 数据库查询

class Poll(models.Model): slug = models.SlugField(unique_for_month='pub_date')question = models.CharField(maxlength=255)pub_date = models.DateTimeField()expire_date = models.DateTimeField() def __repr__(self):return self.question class Meta:get_lates

Django数据库操作ORM

python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 python manage.py runserver 0.0.0.0 python manage.py startapp a

070:【Django数据库】ORM聚合函数详解-准备工作

ORM聚合函数详解-准备工作: 如果你用原生SQL,则可以使用聚合函数来提取数据.比如提取某个商品销售的数量,那么可以使用count,如果想要知道商品销售的平均价格,那么可以使用avg.聚合函数是通过aggregate方法来实现的.在讲解这些聚合函数的用法的时候,都是基于以下的模型对象来实现的. 创建如下models: from django.db import models class Author(models.Model): """作者模型""&qu

071:【Django数据库】ORM聚合函数详解-Avg

ORM聚合函数详解-Avg: Avg:求平均值.比如想要获取所有图书的价格平均值.那么可以使用以下代码实现: from django.db.models import Avg result = Book.objects.aggregate(Avg('price')) print(result) 以上的打印结果是: {"price__avg":23.0} 其中price__avg的结构是根据field__avg规则构成的.如果想要修改默认的名字,那么可以将Avg赋值给一个关键字参数.示例

075: 【Django数据库】ORM聚合函数详解-Sum

ORM聚合函数详解-Sum: Sum :求指定对象的总和.比如要求图书的销售总额.那么可以使用以下代码实现: from djang.db.models import Sum result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total") 以上的代码 annotate 的意思是给 Book 表在查询的时候添加一个字段叫做 total ,这个字段

072:【Django数据库】ORM聚合函数详解-aggregate和annotate

ORM聚合函数详解-aggregate和annotate: aggregate和annotate的区别: 1.aggregate :返回使用聚合函数后的字段和值.2.annotate :在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by).比如以上 Sum 的例子,如果使用的是 annotate ,那么将在每条图书的数据上都添加一个字段叫做 total ,计算这本书的销售总额.而如果使用的是 aggregate ,那

Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM

web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单的web框架: 因为我们不希望接触到TCP连接.HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务. 这个接口就是WSGI:Web Server Gateway Interface. #---------------------myweb.py-------

Django中的app及mysql数据库篇(ORM操作)

Django常见命令 在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目.启动Django程序.创建新的APP.数据库迁移等. 创建Django项目 一把我们都新建一个文件夹来存放项目文件,切换到这个目录下,启动命令行工具.创建一个名为mysite的Django项目: django-admin startproject mysite 创建好项目之后,可以查看当前目录下多出一个名为mysite的文件夹,mysite的文件夹目录结构如下: mysite/ ma

八、Python Django数据库添加查询

Python Django数据库添加查询 对数据进行操作 一.创建记录 # pwd /root/csvt03 # ipython manage.py shell In [1]: from blog.models import Employee #(第一种方法) In [2]: Employee Out[2]: blog.models.Employee In [3]: emp = Employee() In [4]: emp.name = 'Alen' In [5]: emp.save() #(第