#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. Мне нужно определить, как я могу это сделать со стороны сервера