从另一个函数NameError调用函数:名称“ MethodName”未定义

时间:2019-09-05 10:11:37

标签: python django

我是python的新手。如何从另一个函数调用函数。这是一个示例:

class TSMTViewSet(viewsets.ModelViewSet):
    queryset = Tsmt.objects.all()
    serializer_class = TsmtSerializer

def RunNew2N3(fromempid,toempid,fromdate,todate,fromcscid='',tocscid=''):
    cursor = connection.cursor()
    try:
        cursor.callproc('[dbo].[SPRUN]',[fromempid,toempid,fromdate,todate,fromcscid,tocscid])        
    finally:
        cursor.close()

def create(self,request):
    tsmt  = request.data.get('tsmt')

    tsmt['createby']="Admin"             
    tsmt['createdate']=datetime.datetime.now()    

    fromempid = tsmt['empid']
    toempid = tsmt['empid']
    fromdate = tsmt['tdate']
    todate = tsmt['tdate']




    serializer = TsmtSerializer(data=tsmt)

    if serializer.is_valid():
        tsmt_saved = serializer.save()

        RunNew2N3(fromempid,toempid,fromdate,todate)

        return Response({"result":"TSMT '{}' created successfully".format(tsmt_saved.tdate),"status":"success"})
    else:
        return Response({"result":"'{}'".format(serializer.errors),"status":"fail"})

我把call函数放在最上面,为什么我不能调用它。我得到了错误消息

  

NameError:名称'RunNew2N3'未定义

2 个答案:

答案 0 :(得分:1)

这似乎是一个缩进问题,如果RunNew2N3不是TSMTViewSet的一部分,请在外部进行定义,并在类内部将create对齐:

def RunNew2N3(fromempid,toempid,fromdate,todate,fromcscid='',tocscid=''):
    cursor = connection.cursor()
    try:
        cursor.callproc('[dbo].[SPRUN]',[fromempid,toempid,fromdate,todate,fromcscid,tocscid])        
    finally:
        cursor.close()

class TSMTViewSet(viewsets.ModelViewSet):
    queryset = Tsmt.objects.all()
    serializer_class = TsmtSerializer

    def create(self,request):
        tsmt  = request.data.get('tsmt')

        tsmt['createby']="Admin"             
        tsmt['createdate']=datetime.datetime.now()    

        fromempid = tsmt['empid']
        toempid = tsmt['empid']
        fromdate = tsmt['tdate']
        todate = tsmt['tdate']

        serializer = TsmtSerializer(data=tsmt)

        if serializer.is_valid():
            tsmt_saved = serializer.save()

            RunNew2N3(fromempid,toempid,fromdate,todate)

            return Response({"result":"TSMT '{}' created successfully".format(tsmt_saved.tdate),"status":"success"})
        else:
            return Response({"result":"'{}'".format(serializer.errors),"status":"fail"})

答案 1 :(得分:0)

这是基本的Python。如果函数是类实例上的方法,则需要:

  • 在班级缩进
  • 接受self作为第一个参数
  • 通过self进行呼叫。

所以:

class TSMTViewSet(viewsets.ModelViewSet):
    ...

    def RunNew2N3(self, fromempid, toempid, fromdate, todate, fromcscid='', tocscid=''):
        ...

    def create(self, request):
        ...
        self.RunNew2N3(fromempid, toempid, fromdate, todate)
        ...
相关问题