Динамический 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),
]