首页 > 解决方案 > 仅在 Django REST Framework 的 GET 方法中的一个对象

问题描述

当我在我的 api 中通过 api/movies 使用 get 方法时,我有一个所有对象的列表,这没关系。我还想在通过 api/movies/1 使用 get 方法时只获得一个特定的对象,但现在我仍然有我所有对象的列表......在我的 MoviesView 或 url 中要更改什么?

我的views.py

class MoviesView(APIView):
    def get(self, request):
        movies = Movie.objects.all()
        serializer = MovieSerializer(movies, many=True)
        return Response(serializer.data)

我的应用程序urls.py

urlpatterns = [
    url('movies', MoviesView.as_view(), name="MoviesView"),
]

我的项目urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include("api.urls")),
]

当我使用路由器时,一切都会崩溃……你能帮帮我吗?

标签: pythondjangodjango-rest-framework

解决方案


您可以简单地使用原生实现列表和检索的viewsets.ModelViewSet 。

router.register('movies', my_views.MoviesViewSet)在 urls.py 中声明类似的内容,并且

class MoviesViewSet(viewsets.ModelViewSet):
    queryset            = Movie.objects.all()
    serializer_class    = MovieSerializer
    permission_classes  = [IsAuthenticated, ]

    def get_queryset(self):
        return self.queryset

    def get_object(self):
        movie_id = self.kwargs['pk']
        return self.get_queryset().filter(id=movie_id)

    def retrieve(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
        except (Movie.DoesNotExist, KeyError):
            return Response({"error": "Requested Movie does not exist"}, status=status.HTTP_404_NOT_FOUND)
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    def list(self, request, *args, **kwargs):
        queryset    = self.get_queryset()
        serializer  = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

这种方法意味着您声明一个序列化器,就像:

class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model   = Movie
        fields  = '__all__'

Django 简单地将 HOST/movies/ 映射到列表(多个对象)和 HOST/movies/PK/ 以检索方法(一个单个对象)。

文件:

希望能帮助到你。

BR。爱德华多


推荐阅读