我在Django中使用的是REST,我无法理解传统URL与实例化DefaultRouter()之间通过ViewSet注册URL的主要区别。
我有个模特:
class Article(models.Model):
title = models.CharField()
body = models.TextField()
author = models.ForeignKey()像这样序列化模型:
from blog.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['title', 'body', 'author']视图类:
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()和网址:
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
urlpatterns = [
path('', include(router.urls)),
]是否可以在URLS.py中使用经典的URL来代替实例化ViewSet的对象:
urlpatterns = [
path('api/', 'views.someAPI'),
]我只知道HTTP方法在ViewSet翻译方法检索,列表等.问题是,在这种情况下,我们可以使用传统的(经典) URL样式吗?
谢谢你的帮助。
发布于 2022-03-10 01:49:07
简单地说,作为django开发人员,在某些情况下很难处理django中的普通urls。我们不时会混淆细节页的id类型,在某些情况下,它是字符串或整数及其正则表达式,依此类推。
例如:
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路由器,上面的示例是自动完成的:
# using routers -- myapp/urls.py
router.register(r"store", StoreViewSet, basename="store")django将如何理解它:
^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的简单、快速和一致的方法。
https://stackoverflow.com/questions/71387575
复制相似问题