AngularJS1 + Django REST Frameworkに再挑戦 その8 Comment ListAPI View
概要
AngularJS1 + Django REST Frameworkに再挑戦 その8 Comment ListAPI View
参考動画
Django + AngularJS | Coding For Entrepreneurs
Comment ListAPI View
- blog-detai.component.jsのaddReplyを少し修正する。
$scope.addReply = function() { console.log($scope.reply) var token = $cookies.get("token") if (token){ var req = { method: "POST", url: 'http://127.0.0.1:8000/api/comments/create/', data:{ content: $scope.reply.content, slug: slug, type: "post", }, headers:{ authorization: "JWT " + token } }
- ただし、settings.pyの
rest_framework.authentication.SessionAuthentication
をコメントアウトしておかないと、なぜかcommentができない。
"DEFAULT_AUTHENTICATION_CLASSES": ( # 'rest_framework.authentication.SessionAuthentication', 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', #'rest_framework.authentication.BasicAuthentication' ),
- CommentListAPIを修正する。
from django.contrib.contenttypes.models import ContentType ... class CommentListAPIView(ListAPIView): serializer_class = CommentListSerializer permission_classes = [AllowAny] filter_backends= [SearchFilter, OrderingFilter] search_fields = ['content', 'user__first_name'] pagination_class = PostPageNumberPagination #PageNumberPagination def get_queryset(self, *args, **kwargs): #queryset_list = super(PostListAPIView, self).get_queryset(*args, **kwargs) queryset_list = Comment.objects.filter(id__gte=0) #filter(user=self.request.user) query = self.request.GET.get("q") slug = self.request.GET.get("slug") # content we commented on type = self.request.GET.get("type", "post") # content type if slug: model_type = type model_qs = ContentType.objects.filter(model=model_type) if model_qs.exists(): SomeModel = model_qs.first().model_class() obj_qs = SomeModel.objects.filter(slug=slug) if obj_qs.exists(): content_obj = obj_qs.first() queryset_list = Comment.objects.filter_by_instance(content_obj) if query: queryset_list = queryset_list.filter( Q(content__icontains=query)| Q(user__first_name__icontains=query) | Q(user__last_name__icontains=query) ).distinct() return queryset_list ...
何がしたいかというと、
- postのdetailpageに表示されるslugを取得->postのinstanceを絞り込む->そのinstanceで、commentを絞り込む
- content-typeが、postのqueryset(要は、slugでpostを絞り込む)
- さらにその中から、postのinstanceで、コメントを絞り込む。このinstanceで絞り込むところが多分ポイント。
- slugでそのまま絞り込んでも良さそうなきがするけど、ダメなのかな。
さらに修正する。
queryset_list = []
をセットすることと、slugがないときにelseで、空のリストを返すように設定してある。
class CommentListAPIView(ListAPIView): ... def get_queryset(self, *args, **kwargs): #queryset_list = super(PostListAPIView, self).get_queryset(*args, **kwargs) queryset_list = [] query = self.request.GET.get("q") slug = self.request.GET.get("slug") # content we commented on type = self.request.GET.get("type", "post") # content type if slug: model_type = type model_qs = ContentType.objects.filter(model=model_type) if model_qs.exists(): SomeModel = model_qs.first().model_class() obj_qs = SomeModel.objects.filter(slug=slug) if obj_qs.exists(): content_obj = obj_qs.first() queryset_list = Comment.objects.filter_by_instance(content_obj) else: queryset_list = Comment.objects.filter(id__gte=0) #filter(user=self.request.user) if query: queryset_list = queryset_list.filter( Q(content__icontains=query)| Q(user__first_name__icontains=query) | Q(user__last_name__icontains=query) ).distinct() return queryset_list