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.

Вернуться на верх