如何在 Django 中实现服务层?

Moc*_*iel 3 django django-models django-views django-rest-framework

我在本文1和视频2中看到,这对于使用服务层在 Django 中构建 REST 应用程序非常有帮助,因为将业务逻辑放在模型层或视图层中并不是最佳选择。你能和我分享一些简单的 Django 服务模型吗?

小智 6

最好的基于 DRF 的企业应用程序是在 Django 和 DRF 上使用以下结构开发的:-

  • 代理模型(即目的 - 您的默认模型保持干净,所有基于对象的业务逻辑都放在此处。)
  • 自定义管理器(即目的 - DAO(数据访问逻辑)在这里,我们也可以实现
    代码的可重用性)
  • 服务层(即目的 - 核心业务逻辑在这里,因此您的视图类具有更高的可读性)

服务层示例:

class RecoInfoService():

    def get_initiated_reco_detail(self, request, id):
        obj = RecoInfoProxy.objects.get_initiated_reco_by_id(id=id)
        serial_data = GetRecoInfoSerializer(obj)
        return Response(serial_data.data, status=status.HTTP_200_OK)


    def initiate_reco(self, request):
        line_items_service = LineItemsService()
        print(request.data, type(request.data),"in INITIA")
        serial_data = RecoInfoSerializer(data=request.data, many=True, context={'request':request})
        if serial_data.is_valid(raise_exception=True):
            with transaction.atomic(), reversion.create_revision():
                createdObj = reversion_post(request, serial_data)
                self.trigger_reco_initiation_notification(createdObj)
                line_items_service.prefetch_reco_initiation_lineitems(createdObj)
            return createdObj
Run Code Online (Sandbox Code Playgroud)

现在从您的views.py,调用此服务方法为:

class RecoInfoView(views.APIView):

    def post(self, request, **kwargs):
        operation = kwargs.get('operation')
        initiate_reco_service = RecoInfoService()
        if operation == 'request':
            reco_info_obj = initiate_reco_service.initiate_reco(request)
            return Response('msg  : Initiate Reco Successfull')
Run Code Online (Sandbox Code Playgroud)

  • 我认为这并不完全正确。在服务中进行序列化/反序列化有什么意义?服务层应该与表示层无关,它应该接收并返回对象。返回 Respose 将使其只能与视图一起使用,从而无法与其他服务一起使用。 (6认同)