Django rest как разместить комментарии в блоге записи
Я хотел бы узнать, как удалить комментарии на форуме, используя url, подобный этому:
DELETE /api/boards/{board_id}/comments/{comment_id}
В настоящее время я могу перечислить все комментарии и разместить комментарий, используя следующее:
GET /api/boards/{board_id}/comments # will get all comments
POST /api/boards/{board_id}/comments # will create a comment.
Я не знаю, как получить один комментарий и не знаю, как удалить комментарий с помощью дополнительного действия ниже
вот мой текущий взгляд:
class BoardViewSet(ModelViewSet):
queryset = Board.objects.exclude(deleted=True)
serializer_class = BoardSerializerList
permission_classes = [permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly]
def destroy(self, request: Request, *args, **kwargs) -> Response:
board = self.get_object()
if not board.deleted:
board.deleted = True
board.save()
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_400_BAD_REQUEST)
def get_serializer_class(self):
if self.action == 'retrieve':
return BoardSerializerRetrieve
return super().get_serializer_class()
@action(detail=True, methods=['get', 'post', 'delete'], serializer_class=CommentSerializer)
def comments(self, request, pk=None):
if self.request.method == 'GET':
board = self.get_object()
comments = board.comment_set.all()
serializer = CommentSerializer(comments, many=True)
return Response(serializer.data)
if self.request.method == 'POST':
board = self.get_object()
serializer = CommentSerializer(data=request.data)
if serializer.is_valid():
user = serializer.data['user']
text = serializer.data['text']
Comment.objects.create(board=board, user=user, text=text)
return Response(status=status.HTTP_201_CREATED)
вот мои модели:
class Board(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=200, blank=False, null=False)
description = models.TextField(max_length=1000)
share_with_company = models.BooleanField()
share_list = ArrayField(models.CharField(max_length=15), null=True, blank=True)
last_update = models.DateTimeField(auto_now=True)
owner = models.ForeignKey('auth.User', related_name='boards', on_delete=models.CASCADE)
deleted = models.BooleanField(default=False)
history = HistoricalRecords()
class Comment(models.Model):
board = models.ForeignKey(Board, on_delete=models.CASCADE, null=False, blank=False)
user = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
text = models.TextField(max_length=1000
Ниже приведены мои текущие URL:
from .views import BoardViewSet, CommentViewSet, CardViewSet, UserList, UserDetail
router = DefaultRouter()
router.register(r'boards', BoardViewSet, basename='boards')
router.register(r'comments', CommentViewSet, basename='comments')
router.register(r'cards', CardViewSet, basename='cards')
urlpatterns = []
Удалите комментарий, указав его id. Идентификатор форума не нужен, потому что каждый комментарий уникален и имеет свой собственный идентификатор.
def destroy(self, request,id=None):
comment = Comment.objects.get(id=id)
if not comment.deleted:
comment.deleted = True
comment.save()
return Response(status=status.HTTP_204_NO_CONTENT)
return Response(status=status.HTTP_400_BAD_REQUEST)