Django REST Frameworkに再挑戦 その16 Comment Detail, Update, & Delete
概要
Django REST Frameworkに再挑戦 その16 Comment Detail, Update, & Delete
参考サイト
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を返す
便利やな〜!