Динамический URL в DRF Modelviewset

Я работаю над url, где я фильтрую новости по категориям. Все, что я делаю, это передаю название категории в url таким образом 127.0.0.1:8000/news/category/sports/ или 127.0.0.1:8000/news/category/entertainment/. Вот мой фрагмент кода

views.py

class CategoryAPI(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    # lookup_field = 'slug'
    # permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]

    def get_queryset(self):
        category = Category.objects.all()
        return category

    @action(methods=['get'], detail=False, url_path=r'list/(?P<name>[\w-]+', url_name='category')
    def get_category(self, request, category=None):
        return Category.objects.all().order_by(name)

class PostAPI(viewsets.ModelViewSet):
    serializer_class = PostSerializer
    # permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]

    def get_queryset(self):
        news_post = News.objects.all()
        return news_post  

serializers.py

class PostSerializer(serializers.ModelSerializer):
    likes = serializers.SerializerMethodField(read_only=True)
    dislikes = serializers.SerializerMethodField(read_only=True)
    views = serializers.SerializerMethodField(read_only=True)
    # author = serializers.StringRelatedField()
    # category = serializers.StringRelatedField()

    def get_likes(self, obj):
        return obj.likes.count()

    def get_dislikes(self, obj):
        return obj.dislikes.count()

    def get_views(self, obj):
        return obj.views.count()
        
    class Meta:
        model = News
        fields = ('id','category','post_type','title','content','hash_tags','source','author','views',
                  'likes','dislikes','status')


class CategorySerializer(serializers.ModelSerializer):
    posts = PostSerializer(many=True, read_only=True)
    parent = serializers.StringRelatedField()
    class Meta:
        model = Category
        fields = ['name', 'slug', 'parent','posts']

urls.py

router = DefaultRouter()
router.register('news', views.PostAPI, basename='news'),
router.register('category', views.CategoryAPI, basename='category'),
router.register('news-images', views.NewsImageAPI, basename='news-image'),
router.register('comment-room', views.CommentRoomAPI, basename='comment-room'),
router.register('comment', views.CommentAPI, basename='comment')

urlpatterns = [
        
]

urlpatterns += router.urls

Итак, все, что я хочу сделать, это вместо передачи названия категории в url, как я могу создать его динамически. В противном случае мне нужно создать url для каждой категории. Например: 127.0.0.1:8000/news/category/health/, 127.0.0.1:8000/news/category/business/. Как я могу избежать этого. Мне нужна помощь от вас, ребята. Спасибо.

Есть лучший способ сделать это без жесткого кодирования.

В документации по djangorestframework это объясняется в filtering in djangorestframework

вы можете просто создать конечную точку, например

@api_view(['GET'])
def list_post_of_category(request,name=None):
    category = Category.objects.get(name=name)
    posts = category.posts.all().filter(is_active=True)
    serializer = PostSerializer(posts,many=True)
    return Response(serializer.data)

urlpatterns = [
path('post/category/<str:name>',list_post_of_category),
]

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