Вложенные динамические URL из разных наборов представлений

здесь нооб в бэкенде.

У меня вопрос о вложенных URL в Django/DRF. Я хочу вложенную структуру URL, например:
. site.com/blog/: показывает список блогов.
site.com/blog/blog-name/: показывает один блог с названием.
site.com/blog/blog-name/posts: показывает список постов блога.
site.com/blog/blog-name/posts/some-blog-post: отдельная запись в блоге.
site.com/blog/blog-name/posts/some-blog-post/tags: список тегов.
site.com/blog/blog-name/posts/some-blog-post/tags/1: тег с id = 1.

Я прочитал этот ответ, но он предлагает дополнительный метод в BlogViewset. Однако мне нужно вложить URL, используя два разных набора представлений. Потому что, как вы видите, это только начальные поля системы пользовательских блогов, и я хочу иметь возможность управлять ею без больших файлов.

У меня есть три модели, вот так:

class TagModel(models.Model):
    tag = models.CharField(max_length=32)

    def __str__(self):
        return self.tag


class BlogModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    profession = models.CharField(max_length=100)

    class Meta:
        pass

    def __str__(self):
        return self.name


class PostModel(models.Model):
    title = models.CharField(max_length=120)
    content = models.TextField()
    tags = models.ManyToManyField(TagModel)
    blog = models.ForeignKey(BlogModel, on_delete=models.CASCADE, related_name="posts")

    def __str__(self):
        return self.title

Это мой набор представлений для Блогов:

from ..models.blog import BlogModel, PostModel
from ..serializers.blog import BlogSerializer
from rest_framework import viewsets
from rest_framework import mixins
from django.shortcuts import render


class BlogViewset(
    mixins.CreateModelMixin,
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet,
):
    queryset = BlogModel.objects.all()
    serializer_class = BlogSerializer

    # Return all blogs in the database
    def list(self, request):
        blogs = BlogModel.objects.all()
        context = {"blogs": blogs}
        return render(request, "blog/home.html", context)

    # Return single blog object
    def retrieve(self, request, pk):
        blog = BlogModel.objects.get(id=pk)
        context = {"blog": blog}
        return render(request, "blog/blog.html", context)

Набор просмотров для записи в блоге:

from ..models.blog import BlogModel, PostModel
from rest_framework import mixins
from rest_framework import viewsets
from django.shortcuts import render


class BlogPostViewSet(
    mixins.CreateModelMixin,
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet,
):
    def list(self, request):
        posts = PostModel.objects.all()
        context = {"posts": posts}
        return render(request, "blog/posts.html", context)

    def retrieve(self, request, pk):
        post = PostModel.objects.get(id=pk)
        context = {"post": post}
        return render(request, "blog/single.html", context)

И последнее, но не менее важное, у меня urls.py выглядит следующим образом:

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from blog.viewsets import BlogViewset
from blog.viewsets.post import BlogPostViewSet


blog_router = routers.SimpleRouter()
blog_router.register(r"", BlogViewset, basename="blog")

urlpatterns = [
    path("admin/", admin.site.urls),
    path("blog/", include(blog_router.urls)),
]

Спасибо за ваши ответы.

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