【发布时间】:2019-04-21 21:42:36
【问题描述】:
我有本地 django 模型,这些模型反映了一些外部服务的实体。所以基本上当我创建一个本地对象时,我首先向服务发出 post 请求,然后用响应中的数据填充本地对象的字段并保存它。
将外部 api 调用放到模型管理器以抽象视图和测试的逻辑是否是个好主意?还是有更好的方法?
我想要实现的是避免代码库中到处都有重复的逻辑。
【问题讨论】:
我有本地 django 模型,这些模型反映了一些外部服务的实体。所以基本上当我创建一个本地对象时,我首先向服务发出 post 请求,然后用响应中的数据填充本地对象的字段并保存它。
将外部 api 调用放到模型管理器以抽象视图和测试的逻辑是否是个好主意?还是有更好的方法?
我想要实现的是避免代码库中到处都有重复的逻辑。
【问题讨论】:
模型管理器似乎是个好主意。但也许将外部 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
并在视图中使用它们。
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
使用这种分层的好处是将模型和视图与业务逻辑和外部服务分开。也提供了更大的灵活性,因为您可以从服务类对象访问外部 api,而无需访问模型或依赖于模型。
【讨论】: