我的模特:
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?
类似这样的事情,
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。