読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

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

Django REST Frameworkに再挑戦 その16 Comment Detail, Update, & Delete

概要

Django REST Frameworkに再挑戦 その16 Comment Detail, Update, & Delete

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Comment Detail, Update, & Delete

  • EditとDetailを入れ替える。
class CommentEditAPIView(RetrieveAPIView):
    queryset = Comment.objects.all()
    serializer_class = CommentDetailSerializer
    lookup_field = 'pk'


class CommentDetailAPIView(DestroyModelMixin, UpdateModelMixin, RetrieveAPIView):
    queryset = Comment.objects.filter(id__gte=0)#greater than
    serializer_class = CommentDetailSerializer

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)#updatemodelmixinを継承することにより、利用できるメソッド

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)#destroymodelmixinを継承することにより、利用できるメソッド
  • read_only_fields をつける。read_only_fieldsをリストで指定するだけ!この操作の意図は、contentだけを編集できるようにするという点。
class CommentDetailSerializer(ModelSerializer):
    reply_count = SerializerMethodField()
    replies = SerializerMethodField()
    class Meta:
        model = Comment
        fields = [
            'id',
            'content_type',
            'object_id',
            'content',
            'reply_count',
            'replies',
            'timestamp',
        ]
        read_only_fields = [
            'content_type',
            'object_id',
            'reply_count',
            'replies',
        ]
  • permission_classesを追記する。
class CommentDetailAPIView(DestroyModelMixin, UpdateModelMixin, RetrieveAPIView):
    queryset = Comment.objects.filter(id__gte=0)#greater than
    serializer_class = CommentDetailSerializer
    permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
...
  • ただ、上記の設定だと、deleteボタンが消えてしまう。そこでpermissions.pyのclassの定義を修正する。has_permissionの箇所をコメントアウトする。
from rest_framework.permissions import BasePermission, SAFE_METHODS


class IsOwnerOrReadOnly(BasePermission):
    message = 'You must be the owner of this object.'
    # my_safe_method = ['GET','PUT']

    # def has_permission(self, request, view):
    #     if request.method in self.my_safe_method:
    #         return True
    #     return False

    def has_object_permission(self, request, view, obj):
        #member = Membership.objects.get(user=request.user)
        #member.is_active
        if request.method in SAFE_METHODS:
            return True
        return obj.user == request.user # True or Falseを返す

便利やな〜!