Django 鸡与蛋问题

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

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

1、问题背景

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

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

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

2、解决方案

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

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

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

代码示例

python 复制代码
# 方案 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)

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

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

相关推荐
Halo_tjn几秒前
Java Set集合知识点
java·开发语言·数据结构·windows·算法
郝学胜-神的一滴1 分钟前
Linux多线程编程:深入理解pthread_cancel函数
linux·服务器·开发语言·c++·软件工程
廋到被风吹走2 分钟前
【Java】JPA
java·开发语言·oracle
羸弱的穷酸书生3 分钟前
今天跟 AI学了一手
python
不要em0啦4 分钟前
从0开始学python:声明
python
Trouvaille ~4 分钟前
【C++篇】让错误被温柔对待(下):异常高级特性与最佳实践
运维·开发语言·c++·异常·raii·编程实践·基础入门
没有bug.的程序员5 分钟前
服务治理体系:从零到一的全景落地指南
java·开发语言·数据库·微服务·架构
毕设源码-郭学长5 分钟前
【开题答辩全过程】以 基于SpringBoot的足球运动员训练计划管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
ha_lydms6 分钟前
4、Spark 函数_m/n/o/p/q/r
大数据·数据库·python·sql·spark·数据处理·dataworks
kylezhao20196 分钟前
C#上位机开发数据持久化:xml数据导入导出
xml·开发语言·c#