У меня есть модель, и одно из ее полей относится к переопределенному экземпляру пользователя (измененному в настройках Django).Django REST Framework ModelSerializer - объект не сохранен
Когда я выступаю на POST от моего клиента, маршрут заканчивается здесь методом create
:
class CatView(ModelViewSet):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
serializer_class = CatListSerializer
def get_queryset(self):
return Cat.objects.filter(owner=self.request.user).order_by('id')
'''
def list(self, request, format=None):
serializer = CatGetSerializer(Cat.objects.filter(owner=request.user), context={'request': request}, many=True)
return Response(serializer.data)
'''
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def create(self, request, *args, **kwargs):
serializer = CatPutSerializer(data=request.data)
if serializer.is_valid():
serializer.create(serializer.data)
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
При использовании PUT сделать частичное обновление на моей модели, она отлично работает. Но создание одного просто не работает. Я вручную вставляю экземпляр user
в сериализатор и запрашиваю его для создания объекта. Тогда ... ничего. Никакое исключение не возникает, оно возвращает правильные данные, но объект не находится в моей базе данных, а не сохраняется.
В чем проблема?
EDIT:
Когда я добавляю в owner
поле к CatPutSerializer, он открывает вопросы безопасности, так как я не знаю, как это предотвратить, чтобы изменить как я не хочу, чтобы клиент отправьте мне, какого пользователя назначить. И когда я дублируя сериалайзер для использования на POST только запросов, он говорит, что не попадает в поле owner
...
Вот CatPutSerializer
:
class CatPutSerializer(serializers.ModelSerializer):
class Meta:
model = Cat
fields = ('name', 'weight', 'sterilized', 'image', 'tag', 'dob', 'race', 'gender')
UPDATE:
Как предположил, что я сейчас делаю следующее:
def create(self, request, *args, **kwargs):
pdb.set_trace()
serializer = CatPutSerializer(data=request.data)
if serializer.is_valid():
serializer.save(owner=self.request.user)
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
Хотя удалено perform_create
переопределение.
РЕШЕНИЕ:
После дальнейшего расследования, она не кажется, связано с drf
но самой Django/PostgreSQL, поэтому я проверил Джанго модель save
метода, и, кажется, что мой заказ обработка изображений предотвращено новые объекты, которые нужно создать ... Изменено и теперь работает.
Вы пытаетесь создать с помощью PUT? – slider
Нет, на самом деле сериализатор одинаковый для PUT и POST с частичными и не частичными аргументами, я должен изменить его имя. –
Ну, это выглядит хорошо для меня, ха-ха. Можете ли вы отправить образец запроса и ответ, который вы вернете, даже когда данные не сохранены? – slider