首页 > 解决方案 > 在 Django 中将 DetailView 转换为 APIView

问题描述

我正在将Django 转换为 Django REST API。现在我在APIView中遇到 self.object 错误。如何在 APIView 中使用self.object或替代选项?

这是我的详细信息视图...

class ChapterDetail(DetailView):
    model= Chapter
    context_object_name = 'chapter'

    def get_context_data(self, **kwargs):
        context = super(ChapterDetail, self).get_context_data(**kwargs)
        user = self.request.user
        user_practice_game = UserPracticeGame.objects.filter(user=user).filter(practice_game__chapter=self.object).first()
   
        context['user_practice_game'] = user_practice_game

        return context

这是我的 APIView ...

class ChapterDetailAPIView(APIView): # need review
    def get(self, request, *args, **kwargs):
        context = {}
        qs_user_practice_game = UserPracticeGame.objects.filter(user=self.request.user).filter(practice_game__chapter=
        upg_serializer = UserPracticeGame(qs_user_practice_game, many=True)
        context['user_practice_game'] = upg_serializer.data
        return Response(context, status=200)

在 APIView 中,我不能在查询中使用practice_game__chapter=self.object

这是我的模型...

class UserPracticeGame(DateMixin, models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='User', related_name='user_practice_game')
    practice_game = models.ForeignKey(PracticeGame, on_delete=models.CASCADE, verbose_name='Practice Game', related_name='user_practice_game')
    total_answered = models.IntegerField(verbose_name='Total Answered', default=0, blank=True, null=True)

标签: djangoapidjango-modelsdjango-rest-frameworkdjango-views

解决方案


DetailView提供了一个名为的成员方法get_object(),该方法负责提供相应的对象(我们从中获取的对象self.object)。

使用GenericAPIViewfrom drf 而不是APIView. 它提供了相同的get_object()方法,因此您可以访问该对象。这应该可以解决您的问题。

class ChapterDetailAPIView(GenericAPIView):
    queryset = Chapter.objects.all()
    serializer_class = ChapterSerializer # you need a serializer for Chapter
    def get(self, request, *args, **kwargs):
        context = {}
        curr_obj = self.get_object()
        qs_user_practice_game = UserPracticeGame.objects.filter(user=self.request.user).filter(practice_game__chapter=curr_obj)
        upg_serializer = UserPracticeGame(qs_user_practice_game, many=True)
        context['user_practice_game'] = upg_serializer.data
        return Response(context, status=200)

有关GenericAPIView遵循 drf文档的更多信息。


推荐阅读