Как добавить метод post для представления api, чтобы посты можно было комментировать?

Я создаю API с использованием DRF, и поскольку я новичок, я не могу разобраться с этим. Я создаю клон instagram с помощью DRF и смог прикрепить комментарии и лайки к каждому объекту поста, но я могу прикрепить лайки и комментарии только с помощью панели администратора. Однако я могу видеть общее количество лайков/комментариев и пользователя, который их добавил, в виде JSON Output. Есть ли способ добавить форму добавления комментариев в представление post_detail?

Вот мой файл models.py

from __future__ import unicode_literals
import uuid
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings

# Create your models here.



class Createpost(models.Model):
    id = models.UUIDField(
          primary_key = True,
          default=uuid.uuid4,
          editable= False,
    )
    author = models.ForeignKey(User , on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    post_image = models.ImageField(upload_to='images/',blank=True)


    @property
    def total_likes(self):
        return Like.objects.filter(post_id = self.id).count()

    @property
    def likes(self):
        array = []
        for like in Like.objects.filter(post_id = self.id):
            array.append(like.author.username)
        return array
    
    @property
    def total_comments(self):
        return Answers.objects.filter(post_id = self.id).count()

    @property
    def comments(self):
        array = []
        for comment in Answers.objects.filter(post_id = self.id):
            c = {}
            c['body'] = comment.body
            c['username'] = comment.author.username
            c['created_at'] = comment.created_at
            array.append(c)
        return array

    def __str__(self):
        return self.title

class Answers(models.Model):
    post = models.OneToOneField(
        Createpost,
        primary_key=True,
        on_delete = models.CASCADE,
    )
    body = models.TextField()
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    Updated_At = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=False)

    
    def __str__(self):
        return 'Comment {} by {} '.format(self.body,self.author)
class Like(models.Model):
    post = models.OneToOneField(
        Createpost,
        primary_key=True,
        on_delete = models.CASCADE,
    )
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ('post','author',)

Вот мой файл Views.py:

from django.shortcuts import render
from rest_framework import generics
from .models import Createpost
from .permissions import IsAuthorOrReadOnly
from .serializers import PostSerializer,PostDetailSerializer,CommentSerializer

# Create your views here.

class PostList(generics.ListCreateAPIView):
    queryset = Createpost.objects.all()
    serializer_class = PostSerializer


class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    queryset = Createpost.objects.all()
    serializer_class = PostDetailSerializer

Вот мой файл serializers.py:

from rest_framework import status
from rest_framework import serializers
from rest_framework.decorators import APIView
from .models import Createpost,Answers
from django.contrib.auth.models import User


class PostSerializer(serializers.ModelSerializer):
    totallikes = serializers.ReadOnlyField(source = 'total_likes')
    totalcomments = serializers.ReadOnlyField(source = 'total_comments')
    class Meta:
        fields = ('id','author','title','body','created_at','totallikes','totalcomments')
        model = Createpost

class CommentSerializer(serializers.Serializer):
    field1 = serializers.CharField()

class PostDetailSerializer(serializers.ModelSerializer):
    li_kes = serializers.ReadOnlyField(source = 'likes')
    com_ments = serializers.ReadOnlyField(source = 'comments')
    
    class Meta:
        fields = ('id','author','title','body','created_at','updated_at','post_image','li_kes','com_ments',)
        model = Createpost

Я не вижу в вашем коде модели комментариев, поэтому трудно сказать, как именно вы это делаете. Но один из шаблонов для добавления комментариев к объекту поста заключается в создании конечной точки, которая принимает детали комментария в запросе и сохраняет их в пост. Что-то вроде:

from rest_framework import viewsets, status

class PostComment(viewsets.ModelViewSet):

    """ API endpoint for adding comments to posts """

    def create(self, request):

        Data = request.data
        payload = {'post': Data['post_id'], 'user': self.request.user.id, 'comment': Data['comment']]}
        post = UserPost.objects.get(uniqueID=Data['post_id'])
        payload['post'] = post.id

        serializer = UserCommentReplyPOSTSerializer(data=payload)

        if serializer.is_valid():
            serializer.save()
            return Response('Comment saved', status=status.HTTP_200_OK)
        else:
            print(serializer.errors)
            return Response('There was a problem with your request', status=status.HTTP_400_BAD_REQUEST)

Затем вы зарегистрируете эту конечную точку в вашем urls.py и будете использовать ее в вашей процедуре POST комментариев на переднем плане.

Очевидно, что для этого вам понадобится модель Comment с внешним ключом к модели Post. Я предполагаю, что она у вас есть, но не показал ее.

Вернуться на верх