首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django rest_framework DefaultRouter()类与普通url

Django rest_framework DefaultRouter()类与普通url
EN

Stack Overflow用户
提问于 2022-03-07 21:41:18
回答 1查看 399关注 0票数 0

我在Django中使用的是REST,我无法理解传统URL与实例化DefaultRouter()之间通过ViewSet注册URL的主要区别。

我有个模特:

代码语言:javascript
复制
class Article(models.Model):
    title = models.CharField()
    body = models.TextField()
    author = models.ForeignKey()

像这样序列化模型:

代码语言:javascript
复制
from blog.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['title', 'body', 'author']

视图类:

代码语言:javascript
复制
from blog.models import Article
from rest_framework import viewsets
from .serializers import ArticleSerializer


class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()

和网址:

代码语言:javascript
复制
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)

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

是否可以在URLS.py中使用经典的URL来代替实例化ViewSet的对象:

代码语言:javascript
复制
urlpatterns = [
    path('api/', 'views.someAPI'),
]

我只知道HTTP方法在ViewSet翻译方法检索,列表等.问题是,在这种情况下,我们可以使用传统的(经典) URL样式吗?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-10 01:49:07

简单地说,作为django开发人员,在某些情况下很难处理django中的普通urls。我们不时会混淆细节页的id类型,在某些情况下,它是字符串或整数及其正则表达式,依此类推。

例如:

代码语言:javascript
复制
urlpatterns = [
url(r'^(?P<content_type_name>[a-zA-z-_]+)$', views.content_type, name = 'content_type'),
]

# or

urlpatterns = [
    url(r'^(?P<content_type_name>comics|articles|videos)$', views.content_type, name='content_type'),
]

没有提到几乎在每一种情况下,它都需要有两个urls,例如:

URL模式:^user/$ Name:‘users’ URL模式:^user/{pk}/$名称:“用户详细信息”

主差分

然而,使用DRF路由器,上面的示例是自动完成的:

代码语言:javascript
复制
# using routers -- myapp/urls.py
router.register(r"store", StoreViewSet, basename="store")

django将如何理解它:

代码语言:javascript
复制
^store/$ [name='store-list']
^store\.(?P<format>[a-z0-9]+)/?$ [name='store-list']
^store/(?P<pk>[^/.]+)/$ [name='store-detail']
^store/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='store-detail']

看看只使用一行代码就节省了多少工作和头痛?

相反,根据DRF文档,routers是一种使声明urls变得容易的标准类型。一种从ruby-on-rails带来的图案。

以下是文档的详细内容:

资源路由允许您快速声明给定资源的控制器的所有公共路由。而不是为索引声明单独的路径..。一个足智多谋的路由在一行代码中声明它们。 - Rails文档

Django rest框架文档:

有些Web框架(如Rails )提供了自动确定应用程序的URL应该如何映射到处理传入请求的逻辑的功能。 REST框架增加了对Django自动URL路由的支持,并为您提供了一种将视图逻辑连接到一组URL的简单、快速和一致的方法。

有关详细信息,请参阅django rest框架文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71387575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档