Django REST Frameworkに再挑戦 その11 Comment Children & Reply Count
概要
Django REST Frameworkに再挑戦 その11 Comment Children & Reply Count
参考サイト
www.codingforentrepreneurs.com
Comment Children & Reply Count
- comments/api/serializers.pyを修正する。
from rest_framework.serializers import ( HyperlinkedIdentityField, ModelSerializer, SerializerMethodField, ) from comments.models import Comment class CommentSerializer(ModelSerializer): class Meta: model = Comment fields = [ 'id', 'content_type', 'object_id', 'parent', 'content', ] class CommentChildSerializer(ModelSerializer): class Meta: model = Comment fields = [ 'id', 'content', 'timestamp', ] class CommentDetailSerializer(ModelSerializer): replies = SerializerMethodField() class Meta: model = Comment fields = [ 'id', 'content_type', 'object_id', 'content', 'replies', ] def get_replies(self, obj): if obj.is_parent: return CommentChildSerializer(obj.children(), many=True).data return None """ def children(self): return Comment.objects.filter(parent=self) """
- views.pyをセットする。
class CommentDetailAPIView(RetrieveAPIView): queryset = Comment.objects.all() serializer_class = CommentDetailSerializer
エラーが出ると思うのでurls.pyを修正する。(id->pkに修正)
replyの数を数えるserializermethodfieldを付け加える。
from rest_framework.serializers import ( HyperlinkedIdentityField, ModelSerializer, SerializerMethodField, ) from comments.models import Comment class CommentSerializer(ModelSerializer): reply_count = SerializerMethodField() class Meta: model = Comment fields = [ 'id', 'content_type', 'object_id', 'parent', 'content', 'reply_count', 'timestamp', ] def get_reply_count(self, obj): if obj.is_parent: return obj.children().count() return 0 """ def children(self): #replies return Comment.objects.filter(parent=self) """ class CommentChildSerializer(ModelSerializer): class Meta: model = Comment fields = [ 'id', 'content', 'timestamp', ] class CommentDetailSerializer(ModelSerializer): reply_count = SerializerMethodField() replies = SerializerMethodField() class Meta: model = Comment fields = [ 'id', 'content_type', 'object_id', 'content', 'reply_count', 'replies', 'timestamp', 'count', ] def get_replies(self, obj): if obj.is_parent: return CommentChildSerializer(obj.children(), many=True).data return None def get_reply_count(self, obj): if obj.is_parent: return obj.children().count() return 0 """ def children(self): return Comment.objects.filter(parent=self) """