Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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