django - 我应该在 django 模型管理器中进行外部 API 调用吗

标签 django api model

我有本地 django 模型,它反射(reflect)了一些外部服务的实体。因此,基本上,当我创建本地对象时,我首先向服务发出发布请求,然后使用响应中的数据填充本地对象的字段并保存它。

将外部 api 调用放入模型管理器以抽象 View 和测试的逻辑是一个好主意吗?或者有更好的方法吗?

我想要实现的是避免代码库中各处重复的逻辑。

最佳答案

模型管理器似乎是个好主意。但也许最好将外部 api 调用的逻辑放在单独的类中。例如:

class ExternalApiService(object):
    model = ModelName

    def create_object(self, **kwargs):
        # create model object
        self.model.objects.create(**kwargs)

    def call_external_api(self):
        # returns json response from API

    def process_api_response(self, json_response):
        # process response

    def get_latest_object(self):
        # get latest object

    def get_object(self, pk):
        # get object

并在 View 中使用它们。

service = ExternalApiService()

class SomeView(ListView):
    queryset = service.get_queryset()

    def get_context_data(self, *args, **kwargs):
        context = super(SomeView, self).get_context_data(*args, **kwargs)
        context['something_specific'] = service.get_latest_object()
        return context

这种分层的优点是将模型和 View 与业务逻辑和外部服务分开。还提供了更大的灵活性,因为您可以从服务类对象访问外部 api,而无需访问模型或依赖于模型。

关于django - 我应该在 django 模型管理器中进行外部 API 调用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376186/

相关文章:

python - 返回两个模型的多对多字段中的 django 用户

c - Linux 相当于 GetCommandLine 和 CommandLineToArgv?

javascript - 在 Chrome 扩展程序的弹出文件中加载 YouTube 视频时出错?

CakePHP 在 HABTM/ManyToMany 关系中定义附加字段?

php - 我应该在 MVC 中完全分离模型和 ORM 吗?

django - 如何将 Django 模型的一个字段的值设置为等于其他 Django 模型的其他字段

django - 有没有办法让查询遵循输入参数的顺序?

python - 主键和数据插入的 Django 问题

ruby-on-rails - 使用rails命令 "rake db:create:all"时出错 - 我认为它与Ruby的版本冲突有关

php - 小花 3 : Example of model with validation