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

时间:2018-11-19 13:56:02

标签: django api model

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

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

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

1 个答案:

答案 0 :(得分:3)

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

componentDidUpdate() {

    var that = this; 
    var url = window.location.href.split("/");
    var slug = url.pop() || url.pop();
   console.log(CelestialSettings.URL.api + "/posts?slug=" + slug);
    fetch(CelestialSettings.URL.api + "/posts?slug=" + slug)
      .then(function(response) {
        if (!response.ok) {
          throw Error(response.statusText);
        }
        return response.json();  
      })
      .then(function(res) {
        that.setState({ post: res[0] });
      });
  }

并在视图中使用它们。

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

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