Django 鸡与蛋问题

"Django 的鸡与蛋问题"通常指的是在开始 Django 项目时,你可能会遇到的一个困境:是先设计数据库模型还是先编写视图和控制器(即视图函数)?

这个问题的实质是在于,Django 的核心部分是由数据库模型(模型层)、视图(视图层)和控制器(控制器层,通常用视图函数实现)组成的。在开发过程中,你需要设计数据库模型来存储数据,并且你的视图函数需要依赖于这些模型来获取和操作数据。

在这里插入图片描述

1、问题背景

在构建一个应用程序时,需要发送一个 API 调用并保存结果信息,同时在保存之前对信息进行处理。在设计过程中,需要考虑以下三种方案:

  • 方案 1:创建一个独立的类,该类负责进行 API 调用,处理信息(包括根据业务规则进行检查),然后创建 APIRecord(models.Model) 类的实例。
  • 方案 2:创建一个独立的类,该类包含必要的处理和调用 API 的方法,然后在模型中重写 APIRecord.save() 方法,以调用独立类的 API 方法并保存结果。
  • 方案 3:在模型类中构建必要的 API 调用和响应处理方法(包括检查某些值和其他业务规则)。

尝试过方案 2 后,遇到了灵活性方面的问题,但仍然愿意听取建议。目前倾向于方案 1,但还没有确定可能存在的缺点。

2、解决方案

对于这个问题,没有一个一刀切的解决方案,具体的选择取决于具体的设计和编程偏好。以下是一些建议:

  • 方案 1 和方案 3 都可以实现需求,但方案 1 可能会更灵活一些,因为独立类可以更轻松地进行重用和测试。
  • 将部分逻辑放在模型类中,可以使代码更简洁、更易于维护,因为模型类已经包含了与数据库交互的逻辑。
  • 对于需要从其他字段构建的信息,可以在模型类的内部函数中实现。
  • 对于需要访问其他数据库记录的操作,可以在模型类之外的函数中实现。
  • 对于其他不常见的需求,可以在需要的地方进行计算。

最终,在做出决定之前,可以尝试使用不同的方案进行一些实验,以确定哪种方案最适合具体的需求。

代码示例

# 方案 1:创建一个独立的类
class APICaller:def __init__(self, url, payload):self.url = urlself.payload = payloaddef make_api_call(self):response = requests.post(self.url, data=self.payload)return response.json()def process_response(self, response):# 检查业务规则和其他逻辑return processed_data# 在视图中使用 APICaller 类
def my_view(request):api_caller = APICaller('https://example.com/api/endpoint', {'key': 'value'})response = api_caller.make_api_call()processed_data = api_caller.process_response(response)# 保存数据到数据库api_record = APIRecord(data=processed_data)api_record.save()# 方案 2:在模型类中重写 save() 方法
class APIRecord(models.Model):data = models.JSONField()def save(self, *args, **kwargs):# 调用外部函数来处理数据processed_data = process_data(self.data)# 检查业务规则和其他逻辑# 保存数据到数据库super().save(*args, **kwargs)# 方案 3:在模型类中创建方法
class APIRecord(models.Model):data = models.JSONField()def make_api_call(self):# 调用 API 并获取数据response = requests.post('https://example.com/api/endpoint', {'key': 'value'})return response.json()def process_data(self, data):# 检查业务规则和其他逻辑return processed_datadef save(self, *args, **kwargs):# 调用内部函数来处理数据processed_data = self.process_data(self.data)# 保存数据到数据库super().save(*args, **kwargs)

在实际开发中,需要根据项目的具体情况来决定如何解决“鸡与蛋”问题。一些开发者可能更喜欢从数据库模型开始,而另一些开发者可能更愿意先编写视图函数。最重要的是,保持灵活性和适应性,根据项目需求和实际情况来选择合适的方法。

上面就是我整理的所有信息,希望这些信息对你有帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt5/6使用SqlServer用户连接操作SqlServer数据库

网上下载SQLServer2022express版数据库,这里没啥可说的,随你喜欢,也可以下载Develop版本。安装完后,我们可以直接连接尝试, 不过一般来说,还是下载SQLServer管理工具来连接数据更加方便。 所以直接下载ssms, 我在用的时候,一开始只能用Windows身份登录。 所以首先,我…

入门matlab

常识 如何建一个新文件 创建新文件,点击新建,我们就可以开始写代码了 为什么要在代码开头加入clear 假如我们有2个文件,第一个文件里面给x赋值100,第二个文件为输出x 依次运行: 结果输出100,这是因为它们…

ChatGPT Prompt技术全攻略-精通篇:Prompt工程技术的高级应用

系列篇章💥 No.文章1ChatGPT Prompt技术全攻略-入门篇:AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇:深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇:掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

电脑缺失msvcp110.dll文件的解决方法,总结5种靠谱的方法

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“找不到msvcp110.dll”。这个错误提示通常出现在运行某些软件时,那么,它究竟会造成哪些问题呢? 一,msvcp110.dll文件概述 msvcp110.dll是Mic…

推荐云盘哪个好,各有各的优势

选择合适的云盘服务是确保数据安全、便捷分享和高效协作的关键。下面将从多个维度对目前主流的云盘服务进行详细的对比和分析: 速度性能 百度网盘青春版:根据测试,其上传和下载确实不限速,但主要定位是办公人群,适用于…

STM32F103C8T6 HAL库 USART1 DMA方式接收数据

前言: 前面的两篇文章都说关于发送的,HAL库发送数据可以调用现成的函数,而接收数据,现成函数不太好用。这里为了记录了一下自己参考了网上几个大佬的代码,整理了一下USART1 DMA方式接受数据的代码,…

Elasticsearch 认证模拟题 - 17

这两道题目非常具有代表性,分别是跨集群复制和跨集群检索,需要相应的 许可 这里在虚拟机上搭建集群完成这两道题目,这里补充一下 elasticsearch 和 kibana 的配置文件 # elasticsearch.yml cluster.name: cluster2 node.name: cluster2-node…

Linux之文件操作

目录 第1关:文件的创建 任务描述 相关知识 文件的创建 编程要求 答案: 第2关:文件打开与关闭 任务描述 相关知识 文件的打开 文件的关闭 编程要求 答案: 第3关:文件读写操作 任务描述 相关知识 文件的写操作 文件的读…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法:SET key value [EX seconds | PX milliseconds] [NX|XX] 说明:将string类型的value值设置到指定key中,如果之前该key存在,则会覆盖原先的值,原先…

前端计网面试题(二)

一、在浏览器中输入url并且按下回车之后发生了什么? 首先解析url,判断url是否合法,如果合法再判断是否完整。如果不合法,则使用用户默认的搜索引擎进行搜索。DNS域名解析获取URL对应的ip地址。(首先看本地是否有缓存&…

HTML开发 Vue2.x + Element-UI 动态生成表单项并添加表单校验

基于vue2.x 和element-ui 动态生成表单项并添加表单校验; 1、需求问题 如下图,项目有个需求,点击添加按钮,新增一行设备信息,且每项信息必填; 2、代码 看到这个需求,首先想到要使用v-for的形…

使用 flask + qwen 实现 txt2sql 流式输出

前言 一般的大模型提供的 api 都是在提问之后过很久才会返回对话内容,可能要耗时在 3 秒以上了,如果是复杂的问题,大模型在理解和推理的耗时会更长,这种展示结果的方式对于用户体验是很差的。 其实大模型也是可以进行流式输出&a…

Vue3 一 快速启动基于Vite 创建项目

编码规范 TypeScript 组合式API setup语法糖 基于Vite 创建项目 WinR输入 CMD 回车后打开CMD命令行 已安装 18.3以上版本的NodeJS,js(安装) 我们用 NPM 方式安装 输入命令npm create vuelatest PS D:\WORK\NodeJS> npm create vuelatest Need to install the following …

《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV:下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层: 基础设施层由经过资源抽象的网络设备组成,仅实现网络转发等数据平面的功能,不包含或仅包含有限的控制平面的功能。…

Python语言读取图像

import cv2 import numpy as np width 640 # 图像宽度height 480 # 图像高度channels 3 # 颜色通道数imgEmpty np.empty((height, width, channels), np.uint8) # 创建空白数组imgBlack np.zeros((height, width, channels), np.uint8) # 创建黑色图像 RGB0imgWhite …

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标: 学习嵌入式实时操作系统(RTOS&#xf…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 论文及代码详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世,解决了很多计算机和机器人领域的覆盖路径问题,今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

办理公司诉讼记录删除行政处罚记录删除

企业行政处罚记录是可以做到撤销消除的,一直被大多数企业忽略,如果相关诉讼记录得不到及时删除,不仅影响企业招投标,还影响企业的贷款申请,严重的让企业资金链断裂,影响企业长远发展和企业形象。行政处罚是…

SpringBoot整合RabbitMQ实现消息延迟队列

环境依赖 SpringBoot 3.1.0 JDK 17 前期准备 安装MQ: liunxdockerrabbitmq安装延迟队列插件 实例 实现延迟队列的一种方式是在 RabbitMQ 中使用消息延迟插件,这个插件可以让你在消息发送时设置一个延迟时间,超过这个时间后消息才会被消费者接收到…

Vyper重入漏洞解析

什么是重入攻击 Reentrancy攻击是以太坊智能合约中最具破坏性的攻击之一。当一个函数对另一个不可信合约进行外部调用时,就会发生重入攻击。然后,不可信合约会递归调用原始函数,试图耗尽资金。 当合约在发送资金之前未能更新其状态时&#…