DRF как создать дубликат (копию) конечной точки экземпляра?

#django #serialization #django-rest-framework

#django #сериализация #django-rest-framework

Вопрос:

Мои модели:

 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 для дублирования некоторых объектов Book по идентификатору, со всей информацией, которая есть в модели Book, просто скопируйте ее. Как это сделать правильно?

ОБНОВЛЕНИЕ Я проверяю в документах, как сделать копию, но как я могу выбрать pk?

Комментарии:

1. Хм, почему вы хотите дублировать свои данные?

2. @ruddra просто нужен этот случай. и хотите знать, как это сделать

Ответ №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 dublicate(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/ где 1234 это PK Book экземпляра, копию которого вы хотите создать.

Комментарии:

1. Спасибо! теперь мне все ясно. Еще один вопрос, как скопировать также FK этого объекта модели?

2. Тогда это не простое действие. Вы можете прикрепить любую произвольную информацию к полезной нагрузке POST, к которой позже можно получить доступ через request.data

3. как я могу это установить?

4. Это должно быть установлено / присоединено на стороне клиента.

5. Мне нужно определить, как я могу это сделать со стороны сервера