• Django day08


    今日考题

    1.聚合查询和分组查询的关键字是什么?各有什么注意事项?

    1. # 聚合查询
    2. aggregrate
    3. 只要是跟数据库相关的模块一般都在django.db.models
    4. from django.db.models import Max,Min,Avg,Sum,Count
    5. 聚合查询通常都是配合分组一起使用的
    6. # 查询所有书的平均价格
    7. res = models.Book.onjects.aggregrate(Avg('price'))
    8. print(res)
    9. # 分组查询
    10. annotate
    11. # 统计每一本书的作者个数
    12. res = models.Book.object.annotate(author_num=Count('authors')).values('title','author_num')
    13. print(res)
    14. models后面点书就按照书分组,author_num是我们自己定义的字段 用来存储统计出来的每本书对应的作者个数

    2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他的用法

    1. from django.db.models import F
    2. 能够帮助你直接获取表中的某个数据
    3. # 查询卖出数大于库存数的书籍
    4. models.Book.objects.filter(mauchu__gt=F('kucun')).first()
    5. # 将所有书籍价格提高500
    6. models.Book.objects.update(F('price')+500)
    7. # 将所有书的名字都打上爆款两字
    8. from django.db.models import Value
    9. from django.db.models.functions import Concat
    10. models.Book.objects.update(title=Concat(F('title'),Value('爆款')))
    11. Q查询
    12. from django.db.models import Q
    13. models.Book.objects.filter(Q(maichu__gt=800),Q(kuncun__lt=600))
    14. models.Book.objects.filter(Q(maichu__gt=800)|Q(kuncun__lt=600))
    15. models.Book.objects.filter(Q(maichu__gt=800),Q(kuncun__lt=600))
    16. Q的高阶用法
    17. q=Q()
    18. q.children.append('maichu__gt',800)
    19. q.children.append('kucun__lt',600)
    20. models.Book.objects.filter(q)

    3.列举常见的数据字段及主要参数(越多越好)

    1. CharField()
    2. max_length=
    3. InterFiled()
    4. DateField()
    5. auto_now 每次修改记录的时候都会修改时间
    6. auto_now_add 只在创建数据的时候记录创建时间后续不在改动
    7. AutoField

    4.orm数据库查询优化有那些?各有什么特点?

    1. orm 语句特点是:惰性查询,如果你只是书写了orm语句后面并没有用到该语句查询出来的参数 那么orm语句会自动识别 不执行
    2. # 获取书籍表中所有书的名字
    3. res = models.Book.objects.only('title')
    4. for i in res:
    5. print(i.title) # 不会重新走数据库
    6. print(i.price) # 需要重新走数据库查询
    7. defer刚好与only相反,括号内的字段需要重新走数据库查询,外的字段不需要
    8. res = models.Book.objects.all() # 每循环一次就要走一次数据库查询
    9. # for i in res:
    10. # print(i.publish.name)
    11. res = models.Book.objects.select_relate('publish')
    12. '''
    13. select_related内部现将book与publish连起来 然后将大表里面的所有数据对象全部封装给查询出来的对象
    14. 这个时候对象无论是点击book表中的数据还是publish表中的数据都无需再走数据库查询 网络请求越少延迟越低 也就是优化数据库查询
    15. select_related括号内只能放外键字段 一对一 一对多 多对多也不行
    16. '''
    17. res = models.Book.objects.prefetch_relate('publish')
    18. '''
    19. prefetch_related该方法内部就是子查询
    20. 将子查询出来的所有结果也给你封装到对象中
    21. 给你的感觉也好像是一次性搞定
    22. '''

    今日内容概要

    • 图书管理的增删改查
    • choices参数(数据库字段设计常见)
    • MTV与MVC模型
    • 多对多关系的三种创建方式
    • Ajax操作(重点)
    • 前后端传送数据编码格式
    • ajax发送json格式数据
    • ajax发送文件
    • django自带的序列化功能
    • ajax结合sweetalert实现删除的二次确认操作

    今日内容详细

    图书管理的增删改查

    1. from django.conf.urls import url
    2. from django.contrib import admin
    3. from app01 import views
    4. urlpatterns = [
    5. url(r'^admin/', admin.site.urls),
    6. # 首页
    7. url(r'^$',views.home,name='home'),
    8. # 图书的展示页面
    9. url(r'^book/list/',views.book_list,name='book_list'),
    10. # 书籍的添加
    11. url(r'^book/add/',views.book_add,name='book_add'),
    12. # 书籍的编辑(有名分组用来拿到当前对象id)
    13. url(r'^book/edit/(?P\d+)',views.book_edit,name='book_id'),
    14. # 书籍的删除(无名分组用来拿当前对象id)
    15. url(r'^book/delete/(\d+)',views.book_delete,name='book_delete'),
    16. ]
    17. from django.shortcuts import render,HttpResponse,redirect
    18. from app01 import models
    19. # Create your views here.
    20. def home(request):
    21. return render(request,'home.html')
    22. def book_list(request):
    23. # 先查询出所有书籍信息 传递给html页面
    24. book_obj = models.Book.objects.all()
    25. return render(request,'book_list.html',locals())
    26. def book_add(request):
    27. if request.method=='POST':
    28. # 获取前端提交过来的所有数据
    29. title = request.POST.get('title')
    30. price = request.POST.get('price')
    31. publish_date = request.POST.get('publish_date')
    32. publish_id = request.POST.get('publish')
    33. authors_list = request.POST.getlist('authors')
    34. # 操作数据库存储数据
    35. # 书籍表
    36. book_obj = models.Book.objects.create(title=title,price=price,publish_date=publish_date,publish_id=publish_id)
    37. # 书籍与作者的关系表
    38. book_obj.authors.add(*authors_list)
    39. # 跳转到书籍展示页面
    40. '''
    41. redirect括号内可以直接写url 其实也可以写别名
    42. 但是如果你的别名需要额外传参的话,那么就必须使用reverse()解析
    43. '''
    44. return redirect('book_list')
    45. publish_obj = models.Publish.objects.all()
    46. authors_obj = models.Author.objects.all()
    47. return render(request,'book_add.html',locals())
    48. def book_edit(request,edit_id):
    49. # 测试是否获取当前对象id值
    50. # return HttpResponse(edit_id)
    51. # 获取当前用户想要编辑的数据对象 展示个用户看
    52. edit_obj = models.Book.objects.filter(pk=edit_id).first()
    53. publish_obj = models.Publish.objects.all()
    54. authors_obj = models.Author.objects.all()
    55. # 向数据提交数据
    56. if request.method == 'POST':
    57. # 获取前端提交过来的所有数据
    58. title = request.POST.get('title')
    59. price = request.POST.get('price')
    60. publish_date = request.POST.get('publish_date')
    61. publish_id = request.POST.get('publish')
    62. authors_list = request.POST.getlist('authors')
    63. # 操作数据库存储数据
    64. # 编辑书籍表
    65. models.Book.objects.filter(pk=edit_id).update(title=title,
    66. price=price,
    67. publish_date=publish_date,
    68. publish_id=publish_id
    69. )
    70. # 书籍与作者的关系表
    71. edit_obj.authors.set(authors_list)
    72. # 跳转到书籍展示页面
    73. return redirect('book_list')
    74. return render(request,'book_edit.html',locals())
    75. def book_delete(request,delete_id):
    76. # 直接删除
    77. models.Book.objects.filter(pk=delete_id).delete()
    78. return redirect('book_list')

    choices参数(数据库字段设计常见)

    1. class User(models.Model):
    2. name = models.CharField(max_length=32)
    3. age = models.IntegerField()
    4. # 性别
    5. gender_choices = (
    6. (1,'男'),
    7. (2,'女'),
    8. (3,'其他'),
    9. )
    10. gender = models.IntegerField(choices=gender_choices)
    11. '''
    12. 该gender字段存的还是数字,只不过数字对应元组关系。如果存的数字在上面元组列举的范围内,那么可以轻松获取到数字对应的内容
    13. 1.gender字段存的数字不在上述元组列举的范围内容
    14. 2.如果在 如果获取中文信息
    15. '''

    MTV与MCV模型

    1. # MTV
    2. django号称是MTV模型
    3. M:models
    4. T:templates
    5. V:views
    6. # MCV
    7. django的本质也是MVC
    8. M:models
    9. C:controller
    10. V:views

    多对多关系的三种创建方式

    1. # 自动
    2. class Book(models.Model):
    3. name = models.CharField(max_length=32)
    4. authors = models.ManyToManyField(to='Author')
    5. class Author(models.Model):
    6. name = models.CharField(max_length=32)
    7. '''
    8. 优点:代码不需要你写,支持orm提供的操作第三方表关系
    9. 缺点:扩展性极差(没办法额外添加字段)
    10. '''
    11. # 手动
    12. class Author(models.Model):
    13. name = models.CharField(max_length=32)
    14. class Book(models.Model):
    15. name = models.CharField(max_length=32)
    16. class Book2Author(models.Model):
    17. book_id = models.ForeignKey(to='Book')
    18. author_id=models.ForeignKey(to='Author')
    19. '''
    20. 第三方表完全取决你自己额外扩展
    21. 写的代码较多,并且不支持orm提供的简单方法操作第三方表
    22. '''
    23. # 半自动
    24. class Book(models.Model):
    25. name = models.CharField(max_length=32)
    26. authors = models.ManyToManyField(to='Author',
    27. through='Book2Author',
    28. through_fields=('book','author')
    29. )
    30. class Author(models.Model):
    31. name = models.CharField(max_length=32)
    32. # books = models.ManyToManyField(to='Book',
    33. # through='Book2Author',
    34. # through_fields=('author','book')
    35. # )
    36. class Book2Author(models.Model):
    37. book = models.ForeignKey(to='Book')
    38. author = models.ForeignKey(to='Author')
    39. '''
    40. """
    41. through_fields字段先后顺序
    42. 判断的本质:
    43. 通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
    44. 你也可以简化判断
    45. 当前表是谁 就把对应的关联字段放前面
    46. 半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
    47. """
    48. # 你需要掌握的是全自动和半自动为了扩展性更高,一般我们会采用半自动

    Ajax

    1. """
    2. 异步提交
    3. 局部刷新
    4. 例子:github注册
    5. 动态获取用户名实时的跟后端确认并实时展示的前端(局部刷新)
    6. 朝发送请求的方式
    7. 1.浏览器地址栏直接输入url回车 GET请求
    8. 2.a标签href属性 GET请求
    9. 3.form表单 GET请求/POST请求
    10. 4.ajax GET请求/POST请求
    11. AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器)
    12. AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
    13. Ajax我们只学习jQuery封装之后的版本(不学原生的 原生的复杂并且在实际项目中也一般不用)
    14. 所以我们在前端页面使用ajax的时候需要确保导入了jQuery
    15. ps:并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的
    16. """

    小例子

    1. """
    2. 页面上有三个input框
    3. 在前两个框中输入数字 点击按钮 朝后端发送ajax请求
    4. 后端计算出结果 再返回给前端动态展示的到第三个input框中
    5. (整个过程页面不准有刷新,也不能在前端计算)
    6. """
    7. $('#btn').click(function () {
    8. // 朝后端发送ajax请求
    9. $.ajax({
    10. // 1.指定朝哪个后端发送ajax请求
    11. url:'', // 不写就是朝当前地址提交
    12. // 2.请求方式
    13. type:'post', // 不指定默认就是get 都是小写
    14. // 3.数据
    15. {#data:{'username':'jason','password':123},#}
    16. data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
    17. // 4.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
    18. success:function (args) {
    19. {#alert(args) // 通过DOM操作动态渲染到第三个input里面#}
    20. {#$('#d3').val(args)#}
    21. console.log(typeof args)
    22. }
    23. })
    24. })
    25. """
    26. 针对后端如果是用HttpResponse返回的数据 回调函数不会自动帮你反序列化
    27. 如果后端直接用的是JsonResponse返回的数据 回调函数会自动帮你反序列化
    28. HttpResponse解决方式
    29. 1.自己在前端利用JSON.parse()
    30. 2.在ajax里面配置一个参数
    31. (后面再讲)
    32. """

  • 相关阅读:
    为什么团队的自动化没有效果?
    常见索引类型及在MySQL中的应用
    typeScript简单封装axios
    JavaScript和TypeScript的特点
    SAGAN
    计算机组成原理——数据的表示和运算②
    【论文速读】| GPTFUZZER:利用自动生成的越狱提示对大型语言模型进行红队测试
    JS中4种常见的内存泄漏
    装备制造企业是否要转型智能装备后服务型公司?
    汽车诊断系统总线协议规范知识汇总
  • 原文地址:https://blog.csdn.net/m0_59882269/article/details/126296384