day60

2023-11-24 21:30
文章标签 day60

本文主要是介绍day60,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

choice参数

1.引入

以一张信息表为例

性别 学历 工作经验 是否婚配 是否生子 客户来源 ...

针对某个可以列举完全的可能性字段,我们应该如何存储
只要某个字段的可能性时列举完全的,那么一般情况下都会采用choice参数

2.数据准备

from random import choicesfrom django.db import models# Create your models here.
class User(models.Model):username = models.CharField(max_length=32)age = models.IntegerField()# 性别gender_choices = ((1, 'male'),(2, 'female'),(3, 'other'),)score = (('1', 'male'),('2', 'female'),('3', 'other'),)# 保证字段类型跟列举出来的元祖第一个数据类型一致即可gender = models.IntegerField(choices=gender_choices)'''该gender字段存的还是数字 但是如果存的数据在上面元祖列举的范围之内那么可以非常轻松的获取到数字对应的真正内容'''

gender字段存的数字不在上述元组列举的范围内会如何?
如果数字在,如何获取对应的中文注释

3.问题解决

gender字段存的数字在上述元组列举的范围内

from django.test import TestCase# !/usr/bin/env python
import os
import sysif __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day08.settings")import djangodjango.setup()from app01 import modelsmodels.User.objects.create(username="dream", age=18, gender=1)models.User.objects.create(username="mengmeng", age=28, gender=2)models.User.objects.create(username="chimeng", age=39, gender=3)# 存的时候,没有列举出来的数字也能被存进去models.User.objects.create(username="hope", age=44, gender=4)

没有报错,且第四条已经插入到数据库中

gender字段存的数字在上述元组列举的范围内并获取

# 取 - 如果有对应关系
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender)  # 1
# 只要是 choice字段的注释,如果想要获取到注释的信息,固定写法 get_字段名_display()
print(user_obj.get_gender_display())  # male

gender字段存的数字不在上述元组列举的范围内

# 取 - 如果没有对应关系
user_obj = models.User.objects.filter(pk=4).first()
# 如果没有对应关系 字段是什么 返回的就是什么
print(user_obj.get_gender_display())  # 4

总结

  • choice参数使用场景非常广泛

  • 例如

    • 支付方式的选择
    • 生源的来源地
    • 分数的分类
    • 学历的分类

MTV与MVC模型

MTV模型和MVC模型是两种常见的软件设计模式,用于组织和管理用户界面和应用程序的逻辑
虽然它们存在一些相似之处,但它们在设计和应用上有一些不同

MTV模型

MTV模型是指Model-Template-View(模型-模板-视图)模型,是Django框架中采用的一种设计模式。它的核心思想是将应用程序分为三个主要部分:

  • 模型(Model):

    • 模型表示应用程序中处理数据的结构和行为。
    • 它通常与数据库交互,并定义了数据的存储和操作方式。
  • 模板(Template):

    • 模板负责处理用户界面的显示。
    • 它定义了应用程序的外观和布局,并将动态数据与静态页面结合在一起,生成最终的用户界面。
  • 视图(View):

    • 视图处理应用程序的逻辑和业务流程。
    • 它接收用户的请求,从模型中获取数据,将数据传递给模板进行渲染,并生成响应返回给用户。

MTV模型的优点在于它可以很好地将应用程序的逻辑和用户界面进行分离,使代码更容易维护和扩展。

MVC模型

MVC模型是指Model-View-Controller(模型-视图-控制器)模型,是一种常见的软件设计模式,广泛应用于Web开发和其他应用程序中。

  • 模型(Model):

    • 模型负责处理应用程序的数据逻辑。
    • 它包含了数据的存储和操作方式,并定义了数据在应用程序内部如何交互和被操作。
  • 视图(View):

    • 视图是用户界面的表示,负责展示数据给用户并接收用户的输入操作。
    • 它通常从模型中获取数据,并将其显示给用户。
  • 控制器(Controller):

    • 控制器处理用户的交互和请求,并根据用户的行为作出相应的响应。
    • 它接收用户的输入,并更新模型和视图以反映用户的操作。

MVC模型的优点在于它可以很好地分离应用程序的不同组件,使得代码更易于维护、测试和重用。

总结

  • MTV模型主要用于Django框架中,通过将应用程序分为模型、模板和视图,提供了一种清晰的架构方案。
  • MVC模型则是一个通用的设计模式,广泛应用于各种类型的应用程序中。
  • 无论使用哪种模型,都能帮助开发者更好地组织和管理代码,并实现可扩展和可维护的应用程序。

 多对多三种创建方式

全自动

利用ORM自动帮我们创建第三张表关系

class Book(models.Model):name = models.CharField(max_length=32)# 全自动authors = models.ManyToManyField(to='Author')class Author(models.Model):name = models.CharField(max_length=32)

优点:代码不需要自己写,非常方便,还支持ORM提供操作第三张表的方法
缺点:第三张表的扩展性极差(没办法添加额外字段)

纯手动

class Book(models.Model):name = models.CharField(max_length=32)class Author(models.Model):name = models.CharField(max_length=32)class BookAuthor(models.Model):book_id = models.ForeignKey(to='Book')author_id = models.ForeignKey(to='Author')

优点:第三张表完全取决于自己进行额外的拓展
缺点:需要写代码较多,不能使用ORM提供的相关方法

半自动 

class Book(models.Model):name = models.CharField(max_length=32)# 全自动# through_fields : 当前表是谁,第一个参数就是谁# 判断的本质:通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放在前面authors = models.ManyToManyField(to='Author', through='BookAuthor', through_fields=('book', 'author'))class Author(models.Model):name = models.CharField(max_length=32)class BookAuthor(models.Model):book_id = models.ForeignKey(to='Book')author_id = models.ForeignKey(to='Author')

这样虽然可以使用ORM的正反向查询,但是没法使用add,set,remove,clean这四个方法

Ajax

 什么是Ajax

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程想)

优点:Ajax使用JavaScript技术向服务器发送异步请求,Ajax无须刷新整个页面

Ajax案例

【1】案例

  • 页面上有三个 input 框
    • 在前面两个框输入数字,点击按钮,朝后端发送Ajax请求
    • 在后端计算出结果,再返回给前端动态展示的第三个input框中
  • 要求
    • 整个过程页面不能刷新,也不许在前端计算
普通版

后端

from django.shortcuts import render, HttpResponsedef ab_ajax(request):if request.method == 'POST':# print(request.POST)  # <QueryDict: {'i1': ['3'], 'i2': ['4']}>num1 = request.POST.get('i1')  # 3 - 文本类型num2 = request.POST.get('i2')  # 4 - 文本类型# 强转类型并做运算sum = int(num1) + int(num2)# 返回数据return HttpResponse(sum)return render(request, 'ab_ajax.html')

html页面

<script>// 先给按钮绑定点击事件$('#btn').click(function () {// 向后端发送Ajax请求$.ajax({// (1)指定发送后端的请求接口url: '',// 不写就是朝当前地址发送请求// (2)请求方式type: "post", // 不指定默认就是 get 全小写// (3)提交数据data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},// (4)异步提交有一个回调函数 (异步回调机制)// 当后端返回结果的时候会自动触发,args 会自动接受后端传过来的结果success: function (args) {{#alert(args)#}// 通过DOM操作动态数据渲染到第三个 input 框中console.log(args) // string$('#d3').val(args)},})})
</script>

升级版

后端

from django.http import JsonResponse
from django.shortcuts import render, HttpResponse
import json# Create your views here.
def ab_ajax(request):if request.method == 'POST':# print(request.POST)  # <QueryDict: {'i1': ['3'], 'i2': ['4']}>num1 = request.POST.get('i1')  # 3 - 文本类型num2 = request.POST.get('i2')  # 4 - 文本类型# 强转类型并做运算sum = int(num1) + int(num2)# 返回数据data = {"message": "success","sum": sum,}# 需要将数据序列化进行传输return HttpResponse(json.dumps(data))return render(request, 'ab_ajax.html')

html后端

<script>// 先给按钮绑定点击事件$('#btn').click(function () {// 向后端发送Ajax请求$.ajax({// (1)指定发送后端的请求接口url: '',// 不写就是朝当前地址发送请求// (2)请求方式type: "post", // 不指定默认就是 get 全小写// (3)提交数据data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},// 参数 - 会自动反序列化 传过来的数据{#dataType:true,#}// (4)异步提交有一个回调函数 (异步回调机制)// 当后端返回结果的时候会自动触发,args 会自动接受后端传过来的结果success: function (args) {{#alert(args)#}// 通过DOM操作动态数据渲染到第三个 input 框中$('#d3').val(args)},})})
</script>

升级

后端

from django.http import JsonResponse
from django.shortcuts import render, HttpResponse
import json# Create your views here.
def ab_ajax(request):if request.method == 'POST':# print(request.POST)  # <QueryDict: {'i1': ['3'], 'i2': ['4']}>num1 = request.POST.get('i1')  # 3 - 文本类型num2 = request.POST.get('i2')  # 4 - 文本类型# 强转类型并做运算sum = int(num1) + int(num2)# 返回数据data = {"message": "success","sum": sum,}# 需要将数据序列化进行传输return JsonResponse(data)return render(request, 'ab_ajax.html')

html前端

<body><input type="text" id="d1">+
<input type="text" id="d2">=
<input type="text" id="d3">
<p><button id="btn">点我</button>
</p><script>// 先给按钮绑定点击事件$('#btn').click(function () {// 向后端发送Ajax请求$.ajax({// (1)指定发送后端的请求接口url: '',// 不写就是朝当前地址发送请求// (2)请求方式type: "post", // 不指定默认就是 get 全小写// (3)提交数据data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},// 参数 - 会自动反序列化 传过来的数据{#dataType:true,#}// (4)异步提交有一个回调函数 (异步回调机制)// 当后端返回结果的时候会自动触发,args 会自动接受后端传过来的结果success: function (args) {{#alert(args)#}// 通过DOM操作动态数据渲染到第三个 input 框中console.log(args) // object// 经过 JsonResponse 处理过的数据传过来的是 object 对象// object 对象 可以直接 . 属性$('#d3').val(args.sum)},})})
</script></body>

小结

基本语法

<script>// 先给按钮绑定点击事件$('#btn').click(function () {// 向后端发送Ajax请求$.ajax({// (1)指定发送后端的请求接口url: '',// 不写就是朝当前地址发送请求// (2)请求方式type: "post", // 不指定默认就是 get 全小写// (3)提交数据data: {'i1': $('#d1').val(), 'i2': $('#d2').val()},// (4)异步提交有一个回调函数 (异步回调机制)// 当后端返回结果的时候会自动触发,args 会自动接受后端传过来的结果success: function (args) {{#alert(args)#}// 通过DOM操作动态数据渲染到第三个 input 框中console.log(args) // string$('#d3').val(args)},})})
</script>

注意
针对后端如果是用HttpResponse返回的数据,回调函数不会自动帮我们反序列化
针对后端如果是用JsonResponse返回的数据,回调函数会自动帮我们反序列化

HttpResponse解决方式
后端先进行序列化,再返回数据给前端
前端加参数进行反序列化

这篇关于day60的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422579

相关文章

算法训练营day60

题目1:647. 回文子串 - 力扣(LeetCode) class Solution {public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int reslut = 0;for(int i = s.size() - 1;i >= 0;i--

leetcode打卡#day60 647. 回文子串、516. 最长回文子序列

647. 回文子串 class Solution {public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result = 0;for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序fo

前端面试题日常练-day60 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. 在PHP中,以下哪个函数用于获取数组的长度? a) count() b) length() c) size() d) sizeof() 2. PHP中的预定义变量$_SESSION用于存储什么类型的数据? a) 用户的输入数据 b) 浏览器发送的请求信息 c) 服务器的配置信息 d) 用户的会话数据 3. 在PHP中,

代码随想录-算法训练营day60【单调栈03:柱状图中最大的矩形】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第十章 单调栈part03有了之前单调栈的铺垫,这道题目就不难了。 ● 84.柱状图中最大的矩形https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.h

代码随想录day60 | 动态规划P17 | ● 647. ● 516.● 动态规划总结篇

今天 结束动态规划章节 正好是60天 fighting 647. 回文子串   给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入:s = "abc"输出:3

Day60 单调栈 part03

Day60 单调栈 part03 最后一天啦!完结撒花~ 84.柱状图中最大的矩形 我的思路: 感觉和接雨水差不多,只需要多考虑一些情况 双指针 lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。 解答: class Solution {public int largestRectangleArea(int[] heights) {int res =

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点: 1、XXE&XML-原理-用途&外实体&安全 2、XXE&XML-黑盒-格式类型&数据类型 3、XXE&XML-白盒-函数审计

【LeetCode】84. 柱状图中最大的矩形(困难)——代码随想录算法训练营Day60

题目链接:84. 柱状图中最大的矩形 题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights = [2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为 10 示例 2: 输入: heights = [2,4]输出:

代码随想录算法训练营day60 || 647.回文子串,516. 最长回文子序列

动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串_哔哩哔哩_bilibili 动态规划再显神通,LeetCode:516.最长回文子序列_哔哩哔哩_bilibili 647.回文子串 // 时间复杂度O(n^2)// 空间复杂度O(n^2)class Solution {public int countSubstrings(String s) {int

算法刷题 DAY60

647.回文子串 int countSubstrings(char* s) {int res=0;int len=strlen(s);bool dp[len][len];for(int i=0;i<len;i++){for(int j=0;j<len;j++){dp[i][j]=false;}}for(int i=len-1;i>=0;i--){for(int j=i;j<len;j++){if