当前位置: 首页 > news >正文

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

choice参数 1.引入 以一张信息表为例 性别 学历 工作经验 是否婚配 是否生子 客户来源 ... 针对某个可以列举完全的可能性字段&#xff0c;我们应该如何存储 只要某个字段的可能性时列举完全的&#xff0c;那么一般情况下都会采用choice参数 2.数据准备 from random imp…...

thingsboard的WebSocket API的使用

1、参考文档 Working with telemetry data | ThingsBoard Community Edition 2、订阅的命令 我们需要订阅不同的数据,那么该如何来填写参数呢,你需要参考后端代码 TelemetryPluginCmdsWrapper 以及订阅返回的结果参考类:TelemetrySubscriptionUpdate 链接地址: https:/…...

An issue was found when checking AAR metadata

一、报错信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …...

搭建线上jvm监控

这里写目录标题 Springboot项目配置maven依赖application.properties添加监控JVM的配置类启动springboot项目 Prometheus配置配置grafana Springboot项目配置 maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring…...

【计算机网络笔记】数据链路层概述

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

vscode-insiders Remote-SSH XHR failed无法访问远程服务器

问题概述&#xff1a; destFolder/home/apple/.vscode-server-insiders > destFolder2/vscode-cli-05cd2640ec8a106a4ee99cb38e6ee34fbec04f11.tar.gz > 194f252f7426:trigger_server_download_end > Waiting for client to transfer server archive... > W…...

Ubuntu开机显示No bootable devices found

Ubuntu开机报错&#xff0c;显示显示No bootable devices found&#xff0c;如下图所示&#xff1a; 解决方案如下&#xff1a; 1. F2进入BIOS (1) 重启开启&#xff0c;按F2进入BIOS系统。 (2) 进入Boot Sequence&#xff0c;目前系统选择了UEFI&#xff0c;而Legacy选项为…...

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…...

SpringBoot中企业微信的API调用

说明 企业微信官方提供的均为API接口&#xff0c;没有提供集成SDK。因此无需引入Maven依赖&#xff0c;直接以Https方式请求即可。 有些第三方提供了集成的Java SDK&#xff0c;可根据需求自行选用。 本文采用直接调用官方API的方式。 基础配置 企业微信注册后&#xff0c;可…...

[前端] V8引擎编译原理

文章目录 1.什么是V81.1 扫描器Scanner1.2 解析器parser1.3 预解析PreParser1.4 解释器Ignition1.5 编译器TurboFan 1.什么是V8 V8是谷歌的开源高性能JavaScript和WebAssembly引擎&#xff0c;用C编写。它被用于Chrome和Node.js等。它实现ECMAScript和WebAssembly&#xff0c;…...

使用Pytorch实现linear_regression

使用Pytorch实现线性回归 # import necessary packages import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt# Set necessary Hyper-parameters. input_size 1 output_size 1 num_epochs 60 learning_rate 0.001# Define a Toy datas…...

网络安全等级保护收费标准?

不同省份价格会略有不同&#xff0c;二级等保一般不低于5万元;三级等保不低于9万元&#xff0c;个别省份也可能7万也能办理&#xff0c;根据企业实际情况和省市选定的代理机构确定。 等级保护二级? 第二级等保是指信息系统受到破坏后&#xff0c;会对公民、法人和其他组织的合…...

16 Go的反射

概述 在上一节的内容中&#xff0c;我们介绍了Go的并发&#xff0c;包括&#xff1a;Goroutines、Channels、WaitGroups、Mutex、Select等。在本节中&#xff0c;我们将介绍Go的反射。Go语言中的反射是一种在运行时检查类型信息并操作对象的能力&#xff0c;通过反射&#xff0…...

SQL Server 百万数据查询优化技巧三十则

点击上方蓝字关注我 互联网时代的进程越走越深&#xff0c;使用MySQL的人也越来越多&#xff0c;关于MySQL的数据库优化指南很多&#xff0c;而关于SQL SERVER的T-SQL优化指南看上去比较少&#xff0c;近期有学习SQLSERVER的同学问到SQL SERVER数据库有哪些优化建议&#xff1f…...

list转map(根据某个或多个属性分组)

需要将对应的list换成本地list&#xff0c;和对象换成本地对象 1、List转Map<String,List> // 根据一个字段分组 Map<String, List<String>> map objectLists.stream().collect(Collectors.groupingBy(Object::getName,Collectors.mapping(Object::getId, …...

常见树种(贵州省):012茶、花椒、八角、肉桂、杜仲、厚朴、枸杞、忍冬

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、茶 灌…...

千云物流 - 使用k8s负载均衡openelb

openelb的介绍 具体根据官方文档进行安装官方文档,这里作为测试环境的安装使用. OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区…...

C语言之字符串函数

C语言之字符串函数 文章目录 C语言之字符串函数1. strlen的使用和模拟实现1.1 strlen的使用1.2 strlen的模拟实现 2. strcpy的使用和模拟实现2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模拟实现 3. strcat的使用和模拟实现3.1 strcat的使用3.2 strncat3.3 strcat的模拟实现…...

python中一个文件(A.py)怎么调用另一个文件(B.py)中定义的类AA详解和示例

本文主要讲解python文件中怎么调用另外一个py文件中定义的类&#xff0c;将通过代码和示例解读&#xff0c;帮助大家理解和使用。 目录 代码B.pyA.py 调用过程 代码 B.py 如在文件B.py,定义了类别Bottleneck&#xff0c;其包含卷积层、正则化和激活函数层&#xff0c;主要对…...

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了两个地方&#xff0c;承接的是…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...