Я впервые делаю 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 или миксины), могу ли я смешать стратегию, которую я использую сейчас?