【问题标题】:generate a Django-REST-API directly ?直接生成 Django-REST-API 吗?
【发布时间】:2018-05-27 23:12:07
【问题描述】:

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

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

我以前做过这个,所以我熟悉这个过程。 我为模型创建了一个序列化程序,为序列化程序创建了一个 ViewSet 和一个路由器。 我在 2 张桌子上对其进行了测试,并且可以正常工作。

问题是我想公开我所有的 100 个表。并且重复同样的过程 100 次并不好玩。

有没有办法只做一次?

【问题讨论】:

  • 系统必须在某个地方了解您的表的架构是什么。因此,如果您的数据库架构采用某些行业标准格式,您可能会发现有人将其转换为 django 序列化程序。否则,请以此为契机,为社区贡献一个模式到序列化器的转换器。

标签: python django api django-rest-framework models


【解决方案1】:

在 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])
`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多