2016-05-27 4 views
2

У меня есть модель, и одно из ее полей относится к переопределенному экземпляру пользователя (измененному в настройках 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 метода, и, кажется, что мой заказ обработка изображений предотвращено новые объекты, которые нужно создать ... Изменено и теперь работает.

+0

Вы пытаетесь создать с помощью PUT? – slider

+0

Нет, на самом деле сериализатор одинаковый для PUT и POST с частичными и не частичными аргументами, я должен изменить его имя. –

+0

Ну, это выглядит хорошо для меня, ха-ха. Можете ли вы отправить образец запроса и ответ, который вы вернете, даже когда данные не сохранены? – slider

ответ

4

Вы, кажется, переопределяете как create, так и perform_create. Если вы посмотрите на код для CreateModelMixin, который наследует ModelViewSet, вы заметите, что create звонит perform_create, который вызывает serializer.save(). Вы не вызываете perform_create в свой метод create; вы, кажется, звоните serializer.create(...). Если вы переопределяете create, просто выполните следующие действия:

def create(self, request, *args, **kwargs): 
    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) 
+0

Спасибо за ответ! Так я пытался это сделать в первую очередь и не работал. Я удалил переопределение 'perform_create'. Я что-то пропустил? Я добавлю свой сериализатор в качестве редактирования. –

+0

Был хороший ответ, частично помог мне. –

Смежные вопросы