rest_framework.routers模块中DefaultRouter()的高级用法
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路由,以满足项目的需求。
