V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chaleaochexist
V2EX  ›  Python

请教 rest api 如何设计+django rest_framework 如何实现?

  •  1
     
  •   chaleaochexist · 2019-12-03 10:01:40 +08:00 · 2261 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。
    - Root
      - router1
        - category1
            - interface1
              - prefix1
              - prefix2
            - interface2
              - prefix21
        - category2
      - router2
        - category21
    
    大概是这样一个结构. 其中 category 可忽略.
    
    获取 router 信息
    get `*/api/routers/`
    
    default_router.register(
        "api/routers", RouterViewset, base_name="RouterViewset"
    )
    
    获取 category summary 信息
    get `*/api/routers/category_summary`
    在 RouterViewset 中定义
    
        @detail_route(methods=["get"])
        def category_summary(self, request, router_id):
            pass
    
    获取某个 router 中的 interface 信息
    是这么写吧?
    get `*/api/routers/<router_id>/interfaces`
    这样实现
    
        @detail_route(methods=["get"])
        def interfaces(self, request, router_id):
            pass
    
    还是这么写?
    get `*/api/interfaces/?router-id=<id>`
    
    default_router.register(
        "api/interfaces", InterFaceViewset, base_name="InterFaceViewset"
    )
    
    
    以此类推 prefix 如何设计 api 同时如何用 drf 的 router 和 viewset 实现?
    譬如
    `*/api/routers/<router_id>/interfaces/<interface_id>/prefixes`
    类似这样吗?
    
    default_router.register(
        "routers/(?P<router_id>\d+)/interfaces/", InterFaceViewset, base_name="EmixInterFaceViewset"
    )
    
        @detail_route(methods=["get"])
        def prefixes(self, request, router_id, interface_id):
            pass
    
    上面的 url 岂不是被覆盖了?
     "routers/(?P<router_id>\d+)/interfaces/", InterFaceViewset, base_name="EmixInterFaceViewset"
    和
    get `*/api/routers/`
    
    default_router.register(
        "api/routers", RouterViewset, base_name="RouterViewset"
    )
    
    

    谢谢.

    1 条回复    2019-12-03 10:34:01 +08:00
    wuwukai007
        1
    wuwukai007  
       2019-12-03 10:34:01 +08:00
    个人建议还是不要用 viewsets 这种自动注册 url 的,generic 手写吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1184 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:20 · PVG 02:20 · LAX 10:20 · JFK 13:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.