【问题标题】:Dynamic URL in DRF ModelviewsetDRF 模型视图集中的动态 URL
【发布时间】:2022-01-21 03:22:24
【问题描述】:

我正在处理一个根据类别过滤新闻的网址。所以我所做的就是以127.0.0.1:8000/news/category/sports/127.0.0.1:8000/news/category/entertainment/ 的这种方式在 url 中传递类别的名称。这是我的代码 sn-p

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/ 那么我该如何避免呢。我需要你们的帮助。谢谢。

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-urls


    【解决方案1】:

    你可以像这样创建一个端点

    @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),
    ]
    
    

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多