代码之家  ›  专栏  ›  技术社区  ›  M. Dhaouadi

直接生成Django REST API?

  •  0
  • M. Dhaouadi  · 技术社区  · 7 年前

    我已经有了一个包含100个表的数据库。

    现在,我想将其公开为REST-API。

    我以前做过这个,所以我熟悉这个过程。 我为模型创建了一个序列化程序,为序列化程序创建了一个视图集,并创建了一个路由器。 我在两张桌子上测试了它,结果很好。

    问题是我想公开所有100个表。同样的步骤做100次是没有乐趣的。

    有没有办法只做一次?

    1 回复  |  直到 7 年前
        1
  •  0
  •   M. Dhaouadi    7 年前

    看来在django没有办法这样做。

    这不是最好的解决方案,

    有时,根据关系需要不同的序列化程序类

    我刚刚创建了一个有效的脚本:

    您只需要从项目目录运行它,并将应用程序名称作为参数

    `import os
    import sys
    
    ROUTER_TEMPLATE = "router.register(r'{}', views.{}ViewSet)"
    SERIALIZER_TEMPLATE = """
    class {}Serializer(serializers.HyperlinkedModelSerializer):
    
        class Meta:
            model = {}
            fields = '__all__'
    """
    VIEW_TEMPLATE= """
    
    class {}ViewSet(viewsets.ModelViewSet):
        queryset = {}.objects.all()
        serializer_class = {}Serializer
    
    
    """
    
    def gen_api(app_name):
            models= open(app_name+'/models.py', 'r')
        aLines = models.readlines()
    
        for sLine in aLines:
    
            aLine = sLine.split()
    
            for sWord in aLine:
    
                if sWord == "class" and aLine[aLine.index(sWord)+1] != "Meta:":
                    model_name= aLine[aLine.index(sWord)+1].split("(")[0]
                    gen(app_name,model_name )
    
    
    
    
    def gen(app_name, name):
    
        config = open(app_name+'/urls.py', 'a') #append
        config.write("\n"+ ROUTER_TEMPLATE.format(name, name))
        config.close()
    
        config = open(app_name+'/serializers.py', 'a') #append
        config.write("\n"+ SERIALIZER_TEMPLATE.format(name, name))
        config.close()
    
        config = open(app_name+'/views.py', 'a') #append
        config.write("\n"+ VIEW_TEMPLATE.format(name, name, name))
        config.close()
    
    if __name__ == "__main__":
    
        gen_api(sys.argv[1])
    `