当前位置: 首页 > 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;承接的是…...

抖音视频下载终极指南:免费批量下载高清无水印视频的完整方案

抖音视频下载终极指南&#xff1a;免费批量下载高清无水印视频的完整方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

nli-MiniLM2-L6-H768镜像免配置:内置模型缓存机制,首次加载后秒级响应

nli-MiniLM2-L6-H768镜像免配置&#xff1a;内置模型缓存机制&#xff0c;首次加载后秒级响应 1. 项目概述 nli-MiniLM2-L6-H768是一款基于cross-encoder/nli-MiniLM2-L6-H768轻量级NLI模型开发的本地零样本文本分类工具。它彻底改变了传统文本分类需要标注数据和训练模型的复…...

Dev Container首次连接耗时>90秒?揭秘微软内部未公开的remote-ssh+buildkit协同加速方案(实测从142s→8.3s)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Dev Container首次连接耗时&#xff1e;90秒&#xff1f;揭秘微软内部未公开的remote-sshbuildkit协同加速方案&#xff08;实测从142s→8.3s&#xff09; 当 VS Code 通过 Dev Container 连接远程 Lin…...

新三板企业基本信息数据2006-2024年

01、数据介绍新三板企业为全国中小企业股份转让系统挂牌公司&#xff0c;是经过国务院批准设立的全国性证券交易场所上的企业&#xff0c;主要为创新型、创业型、成长型中小微企业发展服务。整理新三板企业数据包括14172个观测值&#xff0c;新三板企业工商基本信息。数据名称&…...

Particalground完全配置手册:20个参数详解与实战案例

Particalground完全配置手册&#xff1a;20个参数详解与实战案例 【免费下载链接】particleground A jQuery plugin for snazzy background particle systems 项目地址: https://gitcode.com/gh_mirrors/pa/particleground Particalground是一款强大的jQuery粒子背景插件…...

树莓派4B双WIFI自动切换配置指南:告别手动切换,实现网络无缝漫游

树莓派4B双WIFI智能切换实战&#xff1a;打造永不掉线的网络冗余系统 在移动办公和物联网部署场景中&#xff0c;网络连接的稳定性直接决定了设备的工作可靠性。想象一下这些场景&#xff1a;正在进行的远程数据同步因办公室WiFi故障而中断&#xff0c;户外展示设备因场地网络变…...

ArcGIS Engine 10.2 + VS2019 实战:手把手教你从零搭建一个带鹰眼和书签的GIS桌面应用

ArcGIS Engine 10.2 VS2019 实战&#xff1a;从零构建专业级GIS桌面应用 在GIS开发领域&#xff0c;能够独立构建功能完善的桌面应用程序是每个开发者的必备技能。本文将带你从零开始&#xff0c;使用ArcGIS Engine 10.2和Visual Studio 2019&#xff0c;一步步打造一个具备鹰…...

YOLOv11 改进系列 | 引入原创 DBD_Down 缺陷边界感知下采样模块,强化裂纹与边缘缺陷特征

YOLOv11 改进 | DBD_Down 边界感知下采样替换 stride-2 Conv 全流程指南 一、本文简介 二、模块原理详解 2.1 层级结构 2.2 前向传播流程 三、改进思想与创新点 3.1 背景与动机 3.2 创新点 1:Sobel 显式边界先验 3.3 创新点 2:边界/内部区域双路径下采样 3.4 创新点 3:边界增…...

从继电器到应答器:手把手拆解一个地铁站台的信号控制逻辑(附示意图)

从继电器到应答器&#xff1a;地铁站台信号控制的动态逻辑拆解 清晨5:30&#xff0c;首班地铁列车即将驶入站台。在乘客看不见的地下空间里&#xff0c;数十组信号设备正进行着精密对话——轨道电路感知列车位置&#xff0c;继电器组合切换电路状态&#xff0c;应答器向车载系统…...

Marzipano 核心组件深度解析:从几何体到渲染器的完整架构

Marzipano 核心组件深度解析&#xff1a;从几何体到渲染器的完整架构 【免费下载链接】marzipano A 360 media viewer for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ma/marzipano Marzipano 是一款强大的现代 Web 360 媒体查看器&#xff0c;其核心架…...