django - 在 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)
解决方案
DetailView
提供了一个名为的成员方法get_object()
,该方法负责提供相应的对象(我们从中获取的对象self.object
)。
使用GenericAPIView
from 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文档的更多信息。
推荐阅读
- google-apps-script - 在 google 邮件 api 中更改 sendAs 电子邮件地址
- javascript - SCRIPT5007:无法获取未定义或空引用的属性“toLowerCase”
- ios - Wrapper 不会将其内在内容大小作为其子项和它们之间的约束的总和
- c# - AES-256-CTR 通过 C# 加密和在 JS 中解密
- c# - 在 UWP 中将文件夹移动到另一个位置的最快方法
- python - Python Requests.get() 不适用于多处理 pool.map
- python - django.urls.exceptions.NoReverseMatch
- sonos - 是否可以更改向用户显示的无法播放错误 - Sonos Music API
- javascript - Cookie 未随 CORS Web 请求一起发送
- pandas - 如何将午夜值 (dd/mm/yyyy 00:00) 归因于前一天?