• 三 .复习python的 ORM 操作


    一.ORM连表高级操作https://www.cnblogs.com/yuanchenqi/articles/8963244.html

    from django.db import models
    
    # 作者
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name=models.CharField( max_length=32)
        age=models.IntegerField()
        # 与AuthorDetail建立一对一的关系
        authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
    
    
    # 作者地址
    class AuthorDetail(models.Model):
    
        nid = models.AutoField(primary_key=True)
        birthday=models.DateField()
        telephone=models.BigIntegerField()
        addr=models.CharField( max_length=64)
    
    
    # 出版社
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name=models.CharField( max_length=32)
        city=models.CharField( max_length=32)
        email=models.EmailField()
    
    
    #
    class Book(models.Model):
    
        nid = models.AutoField(primary_key=True)
        title = models.CharField( max_length=32)
        publishDate=models.DateField(auto_now_add=True)
        price=models.DecimalField(max_digits=5,decimal_places=2)
        # 与Publish建立一对多的关系,外键字段建立在多的一方
        publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
        # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
        authors=models.ManyToManyField(to='Author',)











    from django.shortcuts import render,HttpResponse
    # https://www.cnblogs.com/yuanchenqi/articles/8963244.html
    from  myapp import  models
    from django.db.models import Sum, Count, Avg, Max
    
    
    def index(request):
        return HttpResponse("OK")
    
    def show_date(request):
        # #####################基于对象查询(子查询)##############################
        #                按字段(publish)
        # 一对多   book  ----------------->  publish
        #               <----------------
        #                 book_set.all()
    
        # 正向按照字段查询
        aa=models.Book.objects.filter(title="python").first()
        cc= aa.publish.email
        bb= aa.publish.city
        dd=aa.publish.name
        print(cc,bb,dd)   # 11111  南京   南方出版社
    
    
    
        # 一对多  book<----------------------------------publish   # 反向查询按     表名小写_set.all()
        publish_obj= models.Publish.objects.filter(name="四川出版社").first()
        book_all=publish_obj.book_set.all()   # <QuerySet [<Book: Book object (2)>, <Book: Book object (4)>]>
        for i in  book_all:
            print(i.title)   # java  css
    
    
    
    
        print("**************************************************")
    
    
        #                按字段(authors.all())
        # 多对多   book  ----------------------->  author
        #               <----------------
        #                  book_set.all()
        css=models.Book.objects.filter(title="css").first()         # < QuerySet[ < Author: Authorobject(2) >, < Author: Authorobject(4) >] >
        aut_all=css.authors.all()
        for i in aut_all:
            print(i.name,i.age)       # 李四  33     哈哈  44
    
    
        aut=models.Author.objects.filter(name="张三").first()
        aut_book=aut.book_set.all()
        print(aut_book)  # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]>
        for i in  aut_book:
             print(i.title)  # python    java  html
    
    
    
    
    
        print("**************************************************")
    
        #                  按字段 authorDetail
        # 一对一   author  ----------------------->  authordetail
        #                <----------------
        #                  按表名  author
    
        aa=models.Author.objects.filter(name='李四').first()
        bb=aa.authorDetail.telephone
        ad= aa.authorDetail.addr
        print(bb,ad)    # 44444444  李四北京
    
    
    
    
        # adr=models.AuthorDetail.objects.filter(addr="李四北京").first()
        # po=adr.author.name
        # print(po)     # 李四
    
        adr = models.AuthorDetail.objects.filter(addr="李四北京")
        for ads in adr:
           print(ads.author.name)    # 李四
    
            # 对应sql:
            #
            #    select publish_id from Book where title="python"
            #    select email from Publish where nid =   1
    
    
    
    
    
    
    
    
    
    
        # #####################基于queryset和__查询(join查询)############################
    
        # 正向查询:按字段  反向查询:表名小写
    
    
    
        # 查询python这本书籍的出版社的邮箱
        ret=models.Book.objects.filter(title="python").values("publish__email")   #  正向查询:按字段
        print(ret)      # < QuerySet[{'publish__email': '11111'}] >
        print(ret.query)
           # SELECT"myapp_publish"."email"FROM"myapp_book"INNERJOIN"myapp_publish"ON("myapp_book"."publish_id" = "myapp_publish"."nid")WHERE"myapp_book"."title" = python
    
    
    
    
        ret1 = models.Publish.objects.filter(name="四川出版社").values("book__title")    #  反向查询:表名小写
        print(ret1,"AAAAAAAAAAAAA")      # < QuerySet[{'book__title': 'java'}, {'book__title': 'css'}] > AAAAAAAAAAAAA
        print(ret1.query)   # 生成的sql语句
                            # SELECT "myapp_book"."title" FROM"myapp_publish"LEFT OUTERJOIN"myapp_book" ON("myapp_publish"."nid" = "myapp_book"."publish_id") WHERE"myapp_publish"."name" = 四川出版社
    
        # 查询王五的手机号
        # 方式1:
        ret = models.Author.objects.filter(name="王五").values("authorDetail__telephone")
    
        # 方式2:
        models.AuthorDetail.objects.filter(author__name="王五").values("telephone")
    
    
        # 查询手机号以151开头的作者出版过的书籍名称以及书籍对应的出版社名称
        ret = models.Book.objects.filter(authors__authorDetail__telephone__startswith="151").values('title',"publish__name")
        print(ret.query)
    
    
    
        # 重庆出版社出版的书籍名称
        # 方式1:
        ret1 = models.Publish.objects.filter(name="重庆出版社").values("book__title")
        print("111111111====>", ret1.query)
        # 方式2:
        ret2 = models.Book.objects.filter(publish__name="重庆出版社").values("title")
        print("2222222222====>", ret2.query)
    
    
    
    
        # #####################聚合函数############################
    
    
        # 查看所有书籍的价格总和
        r=models.Book.objects.all().aggregate(price=Sum("price"))
        print(r)   # {'price': Decimal('204000.00')}
    
        # 查看所有作者的平均年龄
        ae=models.Author.objects.all().aggregate(age=Avg("age"))
        print(ae)      # {'age': 30.75}
    
    
    
    
    
        # #####################分组查询############################
    
        rt=models.Author.objects.values("name")
        print(rt)     # < QuerySet[{'name': '张三'}, {'name': '李四'}, {'name': '王五'}, {'name': '哈哈'}] >
        # 查询每一个作者的名字以及出版过价格最高的书籍
        rc=models.Author.objects.values("name").annotate(max_p=Max("book__price")).values("name","max_p")
        print(rc,"wwwwwwwwwwwww")
        # <QuerySet [{'name': '哈哈', 'max_p': Decimal('60000.00')}, {'name': '张三', 'max_p': Decimal('80000.00')}, {'name': '李 四', 'max_p': Decimal('80000.00')}, {'name': '王五', 'max_p': Decimal('40000.00')}]>
    
        # 查询每一个出版社出版的书籍平均价格
        c=models.Publish.objects.values("name").annotate(aaa=Avg("book__price")).values("name","aaa")
        print(c,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
        # <QuerySet [{'name': '南方出版社', 'aaa': 20000.0}, {'name': '四川出版社', 'aaa': 70000.0}, {'name': '重庆出版社', 'aaa': 22000.0}]>
    
        # 查询每一本书籍作者个数
    
        co= models.Book.objects.values("title").annotate(aa=Count("authors__name")).values("title","aa")
        print(co)
    
        # <QuerySet [{'title': 'c++', 'aa': 0}, {'title': 'css', 'aa': 2}, {'title': 'html', 'aa': 3}, {'title': 'java', 'aa': 2}, {'title': 'python', 'aa': 2}]>
    
        return HttpResponse("1111")
    
    
  • 相关阅读:
    【Azure 应用服务】部署Jar到App Service for Linux,因启动命令路径配置错误而引起:( Application Error 问题
    【Azure API 管理】讨论APIM是否适合直接存储文件到Azure Storage Account呢?
    【Azure 应用服务】App Services 恶意软件防护相关
    【Azure 应用服务】使用命令行创建 webapp 应用出现命令语法不正确错误
    【Azure 应用服务】Azure App Service能否使用Storage Account File Share
    【Azure 应用服务】如何关掉App Service/Function App的FTP部署, 使之变成FTPS
    【Azure 应用服务】应用代码需要客户端证书进行验证,部署到App Service后,如何配置让客户端携带证书呢?
    【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
    【Azure 应用服务】可以在app service里建SFTP服务吗?
    【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this operation.)
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11556025.html
Copyright © 2020-2023  润新知