Django rest_framework DefaultRouter() class vs обычный url
Я использую REST в Django, И я не мог понять, в чем основное различие между классическим URL и инстанцированием DefaultRouter() для регистрации URL через ViewSet.
У меня есть модель:
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']
View Class:
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()
и URLS:
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Можно ли использовать классический URL в URLS.py вместо инстанцирования объекта для ViewSet следующим образом:
urlpatterns = [
path('api/', 'views.someAPI'),
]
Я просто знаю, что HTTP метод в ViewSet переводит методы для получения, списка и т.д.... Вопрос в том, можем ли мы использовать традиционный (классический) стиль URL в этой ситуации, должны ли мы?
Спасибо за помощь.
В двух словах, как разработчику django, известно, как трудно в некоторых случаях работать с обычными урлами в django. То и дело мы путаемся с типом id страницы детализации, которые в некоторых случаях являются строками или целыми числами со своим regex и т.д.
Например:
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'),
]
Не говоря уже о том, что почти в каждом случае необходимо иметь два URL, например:
Шаблон URL: ^users/$ Имя: 'user-list'
Шаблон URL: ^users/{pk}/$ Имя: 'user-detail'
ГЛАВНОЕ ОТЛИЧИЕ
Однако при использовании маршрутизаторов 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 является разновидностью стандарта для упрощения объявления урлов. Шаблон взят из ruby-on-rails.
Вот что подробно описано в документации:
Маршрутизация ресурсов позволяет вам быстро объявить все общие маршруты для данного ресурсного контроллера. Вместо того, чтобы объявлять отдельных маршрутов для вашего индекса... ресурсный маршрут объявляет их в одной строке кода.
- Документация по Ruby on Rails
Документация по фреймворку покоя Django:
Некоторые веб-фреймворки, такие как Rails, предоставляют функциональность для автоматического определения того, как URL-адреса для приложения должны быть сопоставить с логикой, которая занимается обработкой входящих запросов.
REST фреймворк добавляет поддержку автоматической маршрутизации URL в Django, и предоставляет вам простой, быстрый и последовательный способ подключения вашей логики представления к набору URL.
Для получения более подробной информации следуйте документации django rest framework.