Djangoroidの奮闘記

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

Comment Create Serializer Function Part 2

概要

Django REST Frameworkに再挑戦 その14 Comment Create Serializer Function Part 2

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Comment Create Serializer Function Part 2

  • comments/models.pyにコードを追記する。model_typeからcommentをcreateするメソッドを定義する。
    def create_by_model_type(self, model_type, slug, content, user, parent_obj=None):
        model_qs = ContentType.objects.filter(model=model_type) # content_typeのvalidationを行う
        if model_qs.exists():
            SomeModel = model_qs.first().model_class() # model_class
            obj_qs = SomeModel.objects.filter(slug=self.slug)
            if obj_qs.exists() and obj_qs.count() == 1:
                instance = self.model()
                instance.content = content
                instance.user = user
                instance.content_type = model_qs.first()
                instance.object_id = obj_qs.first().id
                if parent_obj:
                    instance.parent = parent_obj
                instance.save()
                return instance
        return None
  • comments/api/serializers.pyのCommentCreateSerializerに、createメソッドを追加で定義する。
...
from django.contrib.auth import get_user_model
...
User = get_user_model() # 多分、requestとかから、userをリストで取ってくるんじゃないかなぁ。

def create_comment_serializer(model_type='post', slug=None, parent_id=None): # slugの箇所は、object_idでも可。
    class CommentCreateSerializer(ModelSerializer):
...
        def create(self, validated_data):
            content = validated_data.get("content")
            user = User.objects.all().first()
            model_type = self.model_type
            slug = self.slug
            parent_obj = self.parent_obj
            comment = Comment.objects.create_by_model_type(
                    mmodel_type,slug,user,content,
                    parent_obj=parent_obj)
            return comment
...
  • ややこしいな〜〜!w ここは何回も見ないとよくわからん。