DRF 如何创建实例端点的重复(副本)?

问题描述 投票:0回答:1

我的模特:

class Book(models.Model):
    user = models.ForeignKey(User, models.CASCADE, related_name="books")
    name = models.CharField(max_length=255)

我的看法:

class BooksViewSet(mixins.ListModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.DestroyModelMixin,
                       viewsets.GenericViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = BookSerializer

    def get_queryset(self):
        return Book.objects.filter(user=self.request.user)


   @action(methods=['POST'], detail=False)
   def dublicate(self, *args, **kwargs):
       obj = Book.objects.get(pk=1)
       obj.pk = None
       obj.save()

我的想法是我想使用

@action
通过 id 复制一些 Book 对象,以及 Book 模型刚刚复制的所有信息。怎样做才是正确的呢?

更新 我查看文档如何制作副本,但我如何选择 pk?

django serialization django-rest-framework
1个回答
1
投票

类似这样的事情,

from rest_framework.response import Response


class BooksViewSet(mixins.ListModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.DestroyModelMixin,
                   viewsets.GenericViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = BookSerializer

    def get_queryset(self):
        return Book.objects.filter(user=self.request.user)

    @action(methods=['POST'], detail=True)
    def duplicate(self, request, *args, **kwargs):
        book_instance = self.get_object()
        book_instance.pk = book_instance.id = None
        book_instance.save()
        return Response(self.serializer_class(book_instance).data)

现在,将 HTTP POST 请求发送到

/endpoint/to/book/1234/duplicate
,其中
1234
是您要复制的
Book
实例的 PK。

© www.soinside.com 2019 - 2024. All rights reserved.