HyperlinkedModelViewSet + Схемы: как сделать вложенные URL-адреса? - PullRequest
0 голосов
/ 17 мая 2019

Я впервые делаю API отдыха с django, я сделал учебник на веб-сайте проекта, но теперь у меня есть сомнения, и я не нашел четкого ответа.

APIУ меня есть базовые конечные точки (например: api.site.com/v1/videos/) и другие, которые зависят от вложенной конфигурации (например: api.site.com/v1/videos/<pk:video>/label/<pk:label>).

Но я использую набор представлений HyperlinkedModelViewSet и схемы изRest Framework.

Все вложенные структуры имеют внешние ключи, указывающие на корневые конечные точки.Так что у «метки» модели есть внешний ключ от категорий.Одна категория может иметь несколько меток.

Вот код, над которым я работаю:

urls.py

from django.urls import path, include
from rest_framework import DefaultRouter
from API import views
from rest_framework.schemas import get_schema_view

# Create a router and register our viewsets with it.
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'videos', views.VideoViewSet)
router.register(r'categories', views.CategoryVieWSet)

schema_view = get_schema_view(title='Annotation Tool API')

# The API URLs are now determined automatically by the router.
urlpatterns = [
    path('', include(router.urls)),
    path('schema/', schema_view),
]

views.py

from API.models import User, Video, Category
from API.serializers import UserAPISerializer, VideoSerializer, CategorySerializer
from rest_framework import generics
from rest_framework import permissions
from rest_framework.decorators import api_view
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework import renderers
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):

    queryset = User.objects.all()
    serializer_class = UserAPISerializer

class VideoViewSet(viewsets.ModelViewSet):

    queryset = Video.objects.all()
    serializer_class = VideoSerializer

class CategoryVieWSet(viewsets.ModelViewSet):

    queryset = Category.objects.all()
    serializer_class = CategorySerializer

serializers.py

from rest_framework import serializers
from API.models import User, Video, Category, Label, Track, Annotation, Comment
from django.contrib.auth.models import User as djangoUser

class UserAPISerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'email', 'nickname', 'access', 'created_at',
                'updated_at', 'deleted_at',
                'usr_created', 'usr_updated', 'usr_deleted')

class VideoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Video
        fields = ('id', 'extid', 'access', 'created_at', 'updated_at', 'deleted_at', 
                'created_by', 'updated_by', 'deleted_by')

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name', 'access', 'created_at', 'updated_at', 'deleted_at',
                'created_by', 'updated_by', 'deleted_by', 'description', 'has_duration',
                'settings', 'video')


Я ожидаю, например, назвать конечную точку «метка» следующим образом:

Показать все метки из требуемой категории / Создать новую метку: api.site.com/v1/categories/<category:pk>/labels/

Показать только указанную метку / Обновить указанную метку: api.site.com/v1/categories/<category:pk>/labels/<label:pk>

Как мне добиться того, чтобы с помощью HyperlinkedModel и Схем или использовать другую стратегию?Если есть другая стратегия (например, использование ModelView или миксины), могу ли я смешать стратегию, которую я использую сейчас?

...