多表操作、其他字段和字段参数、django与ajax(回顾)

多表操作

1 基于对象的跨表查

子查询----》执行了两句sql,没有连表操作

 2 基于双下滑线的连表查

一次查询,连表操作

3 正向和反向

放在ForeignKey,OneToOneField,ManyToManyField的
        -related_name='books':双下滑线连表查询,反向查询按表名小写---》用来替换表名小写
        	publish__books__name
        -related_query_name='books':基于对象跨表查,反向查询---》用来替换表名小写
        	pubilsh.book_set.all()
            pubilsh.books.all()

4聚合查询

  • aggregate是 QuerySet 的一个终止子句,用来做聚合查询
  • 聚合函数:Avg,Count,Min,Max,Sum
    -使用
    	select name,price,avg('price') as price__avg from book; 
    	Book.objects.all().aggregate(Avg('price'))
        select name,price,avg('price') as average_price from book; 
        Book.objects.aggregate(average_price=Avg('price'))
        ret = Book.objects.all().aggregate(avg_price=Avg('price'), min_price=Min('price'))

5 分组查询--》分组后通常会用聚合---》annotate用来分组和聚合的

  • annotate:
    • filter在annotate前:表示过滤,where条件
    • values在annotate前:表示分组的字段,如果不写表示按整个表分组
    • filter在annotate后:表示 having条件
    • values在annotate后:表示取字段---》只能取分组字段和聚合函数字段
  • 分组的目的:把有相同特征的分成一组,分成一组后一般用来:统计总条数,统计平均数,求最大值
    -统计每一本书作者个数---》 Book.objects.all().values('id').annotate(author_num=Count("authors")).values('name','author_num')
    
    -统计每一个出版社的最便宜的书---》按出版社
    Publish.objects.all().valuse('id').annotate(min_price=Min("book__price")).vlaues('name','min_price')
 Publish.objects.annotate(MinPrice=Min("book__price"))


	-查询每一个书籍的名称,以及对应的作者个数-->按书分
    Book.objects.all().values('id').annotate(count_publish=Count("authors")).value('name','count_publish')
    
    -查询每一个以 红开头 书籍的名称,以及对应的作者个数-->按书分
     Book.objects.all().filter(name__startswith='红')values('id').annotate(count_publish=Count("authors")).value('name','count_publish')
        
        
   -查询每一个以 红开头 书籍的名称,以及对应的作者个数大于3的记录-->按书分
Book.objects.all().filter(name__startswith='红')values('id').annotate(count_publish=Count("authors")).filter(count_publish__gt=3).value('name','count_publish')

6 F查询与Q查询

  • F查询:拿到某个字段在表中具体的值
    •         -查询评论数大于收藏数的书籍
              from django.db.models import F
              Book.objects.filter(评论数__gt=F('收藏数'))
              -让所有图书价格 +1
              Book.objects.all().update(price=F('price')+1)
  • Q查询:为了组装成  与  或  非 条件
    • 		-与条件:and条件,在filter中直接写---》就是and条件
          		Book.objects.filter(authors__name="lqz",price=100)
          	-或条件:Book.objects.filter(Q(authors__name="lqz")|Q(authors__name="justin"))
              -非条件:Book.objects.filter(~Q(name='红楼梦'))
              
              -复杂逻辑:(名字为红楼梦并且价格大于100) 或者 id 大于 2
              Book.objects.filter((Q(name='红楼梦') & Q(price__gt=100))|Q(nid__gt=2))

其他字段和字段参数

 字段参数;ORM字段参数

  • null用于表示某个字段可以为空。
  • unique 如果设置为unique=True 则该字段在此表中必须是唯一的 。
  • db_index如果db_index=True 则代表着为此字段设置索引。
  • default为该字段设置默认值。
  • DateField和DateTimeField
    • auto_now_add=True:新增会把当前时间存入
    • default=datatime.datatime.now
    • auto_now=True,每次更新数据记录的时候会更新该字段
  • verbose_name       提示,该字段的作用
  • blank               Admin中是否允许用户输入为空
  • editable            Admin中是否可以编辑
  • help_text           Admin中该字段的提示信息
  • choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
    • get_字段名_display()

ForeignKey 属性

   to设置要关联的表
   to_field 设置要关联的表的字段

 related_name 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’。
 related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。

 on_delete
  当删除关联表中的数据时,当前表与其关联的行的行为。
   models.CASCADE删除关联数据,与之关联也删除
   models.DO_NOTHING 删除关联数据,引发错误IntegrityError
   models.PROTECT 删除关联数据,引发错误ProtectedError
   models.SET_NULL删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
   models.SET_DEFAULT删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

   models.SET
  删除关联数据,
  a. 与之关联的值设置为指定值,设置:models.SET(值)
  b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)


 db_constraint---》公司一般都设置为False
    是否在数据库中创建外键约束,默认为True
    db_constraint=False  在数据库中不建立外键约束
    虽然不建立数据库外键约束---》但是orm查询,继续用

ManyToManyField

用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系

     to 设置要关联的表中间是有个中间表的,区别于一对多
     related_name 同ForeignKey字段。
     related_query_name 同ForeignKey字段。
    
     through
    在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
    但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
     through_fields设置关联的字段

     db_table 默认创建第三张表时,数据库中表的名称。

中间表创建方式

自动生成:用不到through 和  through_fields
authors=models.ManyToManyField(to='Author',db_table='中间表表名')
  •  自动创建中间表,有快捷操作
    • add
    • remove
    • set
    • clear

        book表
        id   name           price
        1    西游记           22
        2    红楼梦           33
        
        bookToauthors
        id  book_id   author_id  
        1    1            1
        2    1            2
        
        author表
        id   name    gender    age
        1    lqz      男        18
        2    罗贯中    女        22
手动创建中间表,使用through指定

    三张表都要手动创建--》3个类--》3个表模型---》
    什么情况会使用手动创建?----中间表如果有多的字段,都是手动创建

    authors=models.ManyToManyField(to='Author',through='booktoauthor', through_fields=('当前表--》到中间表的外键关系','剩下的写在第二个位置'))
        book表
        id   name           price
        1    西游记           22
        2    红楼梦           33
        
        booktoauthor
        id  book_id   author_id   日期
        1    1            1       
        2    1            2
        
        author表
        id   name    gender    age
        1    lqz      男        18
        2    罗贯中    女        22
纯手动创建中间表,不使用ManyToManyField关联

不会在book或author表中加 ManyToManyField 字段了

         book表
        id   name           price
        1    西游记           22
        2    红楼梦           33
        
        booktoauthor
        id  book_id   author_id   日期
        1    1            1       
        2    1            2
        
        author表
        id   name    gender    age
        1    lqz      男        18
        2    罗贯中    女        22

在表中都可以定义要给内部类  

class Author(models.Model):
    name = models.CharField(max_length=32)
    class Meta:  #元信息
        db_table
        index_together
        unique_together
        ordering # 默认按id排序

django与ajax

ajax:异步Javascript和XML

作用:Javascript语言与服务器(django)进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)

同步交互,异步交互

    同步交互:js发送出请求---》直到请求回来---》页面不能操作,不能点击
    异步交互:js发出请求---》等待请求回来的过程中--->页面可以随意继续操作

使用:使用了jq帮咱们封装的方法  ajax ,名字跟ajax相同 $.ajax

真正的ajax原生,需要使用js操作,jq的ajax方法是对原生js的封装,方便咱们使用

    -前后端混合项目中,我们通常使用jq的ajax实现 js和后端异步交互
        -jq操作dom
        -jq发ajax请求
    -前后端分离项目中,我们会使用另一个第三方库,实现 js和后端异步交互(axios)
        -只想发送ajax请求---》只用来发ajax请求的库

计算 +  小案例

  • demo01.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<h1>写一个计算小案例--ajax</h1>
<input type="text"name="one" id="one"> + <input type="text"name="two" id="two"> = <input type="text"name="three"id="three">
<button id = 'id_btn'>计算</button>
</body>
<script>
    $("#id_btn").click(function (){
        {#alert("xxx")#}
        var one=$("#one").val()
        var two=$("#two").val()
        $.ajax({
            url:'/demo01/',
            method:'post',
            data:{one,two},
            success:function (res){
                console.log(typeof res)
                if (res.code==100){
                    $("#three").val(res.result)
                }else {
                    alert(res.msg)
                }
            }
        })
    })
</script>
</html>
  •  views.py
def demo01(requset):
    if requset.method=='GET':
        return render(requset,'demo01.html')
    else:
        one=int(requset.POST.get('one'))
        two=int(requset.POST.get('two'))
        return JsonResponse({'code':100,'msg':'计算成功','result':one+two})

上传文件

  • demo01.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>

<hr>
<h1>文件上传</h1>
<input type="file" id="id_file"><button id="id_submit">文件上传</button>
</body>
<script>
        $("#id_submit").click(function (){
            {#alert("xxx")#}
            var formdata = new FormData()
            //$('#id_file')[0].files[0]
            //$('#id_file')根据id拿到标签———》jq把标签放到一个列表中,
            //取第0个位置,是取出第一个符合条件【id为id_file】的标签,想拿文件---》标签对象.files--->对象---》从对象中取出key为0队友的文件对象
            formdata.append('myfile',$('#id_file')[0].files[0])
        $.ajax({
            url:'/demo01/',
            method:'post',
            //指定编码上传文件
            processData: false,
            contentDocument:false,
            data:formdata,
            success:function (res){
                if (res.code==100){
                    alert(res.msg)
                }else {
                    alert(res.msg)
                }
            }
        })
    })
</script>
</html>
  • views.py
def demo01(requset):
    if requset.method=='GET':
        return render(requset,'demo01.html')
    else:
        myfile=requset.FILES.get('myfile')
        with open(myfile.name,'wb') as f:
            for line in myfile:
                f.write(line)
        return JsonResponse({'code':100,'msg':'文件上传成功',})

json格式用的多,后期

	      $.ajax({
            url: '/demo01/',
            method: 'post',
            contentType: 'application/json',
            data: JSON.stringify({name: 'lqz', age: 19}), // 把对象转成字符串形式,json格式字符串
            success: function (data) {
                console.log(data)
            }
        })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

13、pytest为失败的断言定义自己的解释

官方实例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…

抖音集团面试挂在2面,复盘后,决定二战.....

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

用友NC FileUploadServlet 反序列化RCE漏洞复现

0x01 产品简介 用友 NC 是用友网络科技股份有限公司开发的一款大型企业数字化平台。 0x02 漏洞概述 用友 NC nc.file.pub.imple.FileUploadServlet 反序列化漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x03 复现环…

什么是服务端渲染,SSR解决了什么问题

面试官&#xff1a;SSR解决了什么问题&#xff1f;有做过SSR吗&#xff1f;你是怎么做的&#xff1f; 一、是什么 Server-Side Rendering 我们称其为SSR&#xff0c;意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术&#xff0c;发送到浏览器&#xff0c;然…

OTFX欧汇提供更优质的外汇交易产品和服务

OTFX的外汇交易明智决策能力&#xff1a;准确捕捉外汇市场机会&#xff0c;实现稳定盈利 把握机遇&#xff0c;重要的是争取而不是等待。在金融市场中&#xff0c;明智的决策能力对于外汇交易成败至关重要。及时的断绝&#xff0c;果断的出手&#xff0c;才能够保证出手的成功…

【Flink】Flink核心概念简述

目录 一、Flink 简介二、Flink 组件栈1. API & Libraries 层2. runtime层3. 物理部署层 三、Flink 集群架构四、Flink基本编程模型五、Flink 的优点 一、Flink 简介 Apache Flink 的前身是柏林理工大学一个研究性项目&#xff0c; 在 2014 被 Apache 孵化器所接受&#xf…

【黑马甄选离线数仓day08_会员主题域开发】

1. 会员主题域需求说明 1.1 各类会员数量统计 说明&#xff1a;公司为了对不同会员进行不同的营销策略&#xff0c;对各类会员的数量都非常敏感&#xff0c;比如注册会员、消费会员、复购会员、活跃会员、沉睡会员。不仅需要看新增数量还要看累积数量。 指标&#xff1a;新增…

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散&#xff1a;让AI给出时代或今日或你关注的热点事件 比如采集新闻头条&#xff0c;根据内容或标题&#xff0c;以不同的角度&#xff0c;或各种人群的角色&#xff0c;生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面&#xff0c;海量生成】…

开源CDN软件GoEdge —— 筑梦之路

官方网站&#xff1a;GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件&#xff0c;目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰&#xff0c;安装简单&a…

Autosar MCAL-RH850P1HC Port配置

文章目录 PortPortGroupPortPin PortFilterGroupConfigDigital Filter Clock Selection0Digital Filter Clock Selection1 PortGeneralCritical Section ProtectionDev Error DetectDevice NameMax ModeSet Pin Default Modee ApiSet Pin Modee ApiSet to Dio Alt Modee ApiUse…

为什么要替换 Object.defineProperty?

目录 前言&#xff1a;为什么要替换 Object.defineProperty&#xff1f; 详解&#xff1a;为什么要替换 Object.defineProperty&#xff1f; 总结&#xff1a; 前言&#xff1a;为什么要替换 Object.defineProperty&#xff1f; JavaScript中的Object.defineProperty是一种…

个人Windows电脑通过Cloudreve+Cpolar搭建PHP云盘系统公网可访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

flask web开发学习之初识flask(二)

文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…

一次性客户的笔记总结

创建一次性客户&#xff0c;系统会给出一个客户编码&#xff1b; 每次记账的时候&#xff0c;在录入过账码及客户编码后&#xff0c;点击回车&#xff0c;都需要录入这个客户的详细信息&#xff08;比如 客户名称等&#xff09; 一次性客户的信息存储在BSEC表中&#xff0c;这种…

【Java 基础】16 泛型

文章目录 什么是泛型&#xff1f;泛型的声明泛型的使用泛型方法通配符和泛型上下界1&#xff09;通配符2&#xff09;泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型&#xff0c;我们可以编写更加 通用、 灵活、 可读性高的…

使用百度开发者平台处理语音朗读

--TIME --百度开发者中心-汇聚、开放、助力、共赢 --注册账号 -- 准备工作 准备工作 更新时间&#xff1a;2023-01-13 成为开发者 三步完成账号的基本注册与认证&#xff1a; STEP1&#xff1a;点击进入控制台&#xff0c;选择需要使用的AI服务项。若为未登录状态&#xf…

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文&#xff08;点击这里&#xff09;&#xff0c;有助于理解。 模拟频率&#xff1a;f 模拟角频率&#xff1a;Ω 数字角频率&#xff1a;ω 其中&#xff1a;在模拟信号中Ω 2πf 正弦波表示&#xff1a;sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…

【动态规划】LeetCode-198/LCR089.打家劫舍

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

整数和浮点数在内存中的存储

文章目录 每日一言整数在内存中的存储方式浮点数在内存中的存储结语 每日一言 You just can’t beat the person who never gives up. 你无法打败那位永不放弃的人。 整数在内存中的存储方式 整数在内存中的存储方式通常采用二进制形式&#xff0c;即将整数的数值转化为二进制…

笔记66:自注意力和位置编码

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a a a a