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 = url
        self.payload = payload

    def 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_data

    def save(self, *args, **kwargs):
        # 调用内部函数来处理数据
        processed_data = self.process_data(self.data)

        # 保存数据到数据库
        super().save(*args, **kwargs)

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PDF转图片工具

背景: 今天有个朋友找我:“我有个文件需要更改,但是文档是PDF的,需要你帮我改下内容,你是搞软件的,这个对你应该是轻车熟路了吧,帮我弄弄吧”,听到这话我本想反驳,我是开…

python - Pandas缺失值处理

文中所用数据集已上传,找不到的可以私聊我 学习目标 知道空值和缺失值的区别以及缺失值的影响 知道如何查看数据集缺失值情况的方法 知道缺失值处理的办法 1 NaN简介 好多数据集都含缺失数据。缺失数据有多种表现形式 数据库中,缺失数据表示为NULL 在某些编程语…

LeetCode338比特位计数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 解析 动态规划&#xff0c;将当前的数的最后一位去掉&#xff0c;然后判断去掉的最后一位是0还是1。…

pip(3) install,完美解决 externally-managed-environment

前言 现象 在 Manjaro 22、Ubuntu 23.04、Fedora 38 等最新的linux发行版中运行pip install时&#xff0c;通常会收到一个错误提示&#xff1a;error: externally-managed-environment&#xff0c;即“外部管理环境”错误&#xff0c;但这不是一个 bug。 如果您想阅读&#x…

Chrome浏览器书签同步不及时怎么办?两种方法帮你解决!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

9.7 Go语言入门(映射 Map)

Go语言入门&#xff08;映射 Map&#xff09; 目录六、映射 Map1. 声明和初始化映射1.1 使用 make 函数1.2 使用映射字面量 2. 映射的基本操作2.1 插入和更新元素2.2 访问元素2.3 检查键是否存在2.4 删除元素2.5 获取映射的长度 3. 遍历映射4. 映射的注意事项4.1 映射的零值4.2…

Foxmail邮箱的使用方法和功能最全介绍

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

Elasticsearch 管道查询语言 ES|QL 现已正式发布

作者&#xff1a;Costin Leau, George Kobar 今天&#xff0c;我们很高兴地宣布 ES|QL&#xff08;Elasticsearch 查询语言&#xff09;全面上市&#xff0c;这是一种从头开始设计的动态语言&#xff0c;用于转换、丰富和简化数据调查。在新的查询引擎的支持下&#xff0c;ES|Q…

【JAVASE】详讲JAVA语法

这篇你将收获到以下知识&#xff1a; &#xff08;1&#xff09;方法重载 &#xff08;2&#xff09;方法签名 一&#xff1a;方法重载 什么是方法重载&#xff1f; 在一个类中&#xff0c;出现了多个方法的名称相同&#xff0c;但是它们的形参列表是不同的&#xff0c;那…

Transparent 且 Post-quantum zkSNARKs

1. 引言 前序博客有&#xff1a; SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇 上图摘自STARKs and STARK VM: Proofs of Computational Integrity。 上图选自&#xff1a;Dan Boneh 斯坦福大学 CS251 Fall 2023 Building a SNARK 课件。 SNARK…

逻辑这回事(四)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…

C语言王国——数据的内存管理

目录 一、引言 二、整形在内存中的存储 2.1 进制之间的转换 2.1.1 整形的二进制 2.1.2 十进制和二进制 2.1.3 十进制和八进制的转换 2.1.4 十六进制和十进制的转换 2.2 原码&#xff0c;反码&#xff0c;和补码 三、大、小端字节序 3.1 大小端的定义 3.2 为什么会有大…

【Linux进程篇】Linux中的等待机制与替换策略

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 ​编辑 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 阻塞与非阻塞 进程程序替换 替换原理 替换函数 进程等待 进程等待必要性 之前讲过&#xff0c;子进程退出&am…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格&#xff08;…

C# E2Pose人体关键点检测(OpenVINO推理)

C# E2Pose人体关键点检测(OpenVINO推理) 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;inputimg tensor&#xff1a;Float[1, 3, 512, 512] --------------------------------------------------------------- Ou…

实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》

你有没有发现&#xff0c;困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后&#xff0c;您应该能够确定有关该 IP 地…

二、Nginx原来是这样?(系列篇02)

二、Nginx原来是这样&#xff1f;&#xff08;系列篇02&#xff09; 大家好&#xff0c;我是秋意零。 今天分享Nginx系列篇的第二节。Nginx目录结构、运行原理、基本配置。 更多请关注&#xff0c;Nginx系列篇主页&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__b…

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 三、总结 学习目标&#xff1a; 学习嵌入式实时操作系统&#xff08;RTOS&#xf…

找素数第二、三种方法

文章目录 第一种 &#xff1a;使用标签第二种&#xff1a;本质是方法的分装 第一种 &#xff1a;使用标签 没有使用信号量。break和continue作用范围只是最近的循环&#xff0c;无法控制外部循环。 此时使用标签 对外部循环进行操作。 package com.zhang; /* 找素数 第二种方…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…