欢迎访问宙启技术站
智能推送

rest_framework.routers模块中DefaultRouter()的高级用法

发布时间:2023-12-28 03:42:36

DefaultRouter是Django Rest Framework(DRF)中的一个类,它用于自动生成路由。它为我们提供了创建标准的RESTful API路由的简便方法。

DefaultRouter的高级用法包括:增加非模型视图、添加额外的路由、设置前缀等。

下面以一个示例来详细说明DefaultRouter的高级用法:

我们有一个简单的电影评分应用,包含以下模型:

from django.db import models

class Movie(models.Model):
    title = models.CharField(max_length=200)
    genre = models.CharField(max_length=200)

class Review(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    comment = models.TextField()
    rating = models.IntegerField()

我们为电影和评论创建了模型,并使用ForeignKey定义了它们之间的关系。

现在我们希望为电影和评论分别创建API视图,并使用DefaultRouter自动生成路由。

首先,在我们的项目的urls.py文件中导入DefaultRouter和相应的视图:

from rest_framework.routers import DefaultRouter
from movies.views import MovieViewSet, ReviewViewSet

然后, 创建一个DefaultRouter的实例,并将视图与路由关联:

router = DefaultRouter()
router.register(r'movies', MovieViewSet, basename='movie')
router.register(r'reviews', ReviewViewSet, basename='review')

在上面的代码中,我们使用register()方法将MovieViewSet和ReviewViewSet视图注册到路由中。basename参数用于为路由指定名称,这将在生成URL时使用。

如果我们只是简单地使用上述代码,DefaultRouter将为我们生成以下路由:

/movies/ - GET(获取所有电影),POST(创建新电影)
/movies/{id}/ - GET(获取指定ID的电影),PUT(更新指定ID的电影),DELETE(删除指定ID的电影)
/reviews/ - GET(获取所有评论),POST(创建新评论)
/reviews/{id}/ - GET(获取指定ID的评论),PUT(更新指定ID的评论),DELETE(删除指定ID的评论)

这些路由与常见的RESTful API惯例一致,即简单地使用URL路径和HTTP方法来定义对资源的CRUD操作。

接下来,如果我们想添加非模型视图和额外的路由,可以使用router.register()方法的 个参数,该参数接受正则表达式:

from movies.views import RatingView

router.register(r'movies/(?P<movie_id>\d+)/rate', RatingView, basename='rating')

上述代码将创建一个URL路径为/movies/{movie_id}/rate/的路由,并将RatingView视图与之关联。我们使用正则表达式来捕获电影ID,并在视图中使用它进行评分。

最后,我们将生成的路由添加到项目的urls.py文件中:

urlpatterns = [
    ...
    path('api/', include(router.urls)),
    ...
]

现在,我们可以通过以下URL访问API:

- /api/movies/

- /api/movies/{id}

- /api/movies/{movie_id}/rate/

- /api/reviews/

- /api/reviews/{id}

这些URL将自动映射到相应的视图,并执行相应的操作。

综上所述,DefaultRouter提供了一种简便的方式来自动生成常见的RESTful API路由。除了基本的自动路由外,它还支持高级用法,如添加非模型视图和额外的路由。这使得我们可以更灵活地定义我们的API路由,以满足项目的需求。