2016-05-27 13 views
2

モデルがあり、そのフィールドの1つは、オーバーライドされたUserインスタンス(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

私はCatPutSerializerにownerフィールドを追加しているとき、私は私がクライアントを望んでいないように変更するために、これを防ぐために方法を知らないので、それはセキュリティ上の問題を開きますどのユーザーに割り当てるか教えてください。そして私は...それはそれはownerフィールドをミスと言い、

をPOSTリクエストだけで使用するシリアライザを複製していたときにここで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が優先されます。

SOLUTION

さらに調査した後、それはdrfではなくジャンゴ/のPostgreSQL自体に関連していないようですので、私はDjangoのモデルsave方法をチェックし、私のカスタム画像処理を防止ようです新しいオブジェクトを作成する...それを変更し、今すぐ動作します。

+0

PUTを使用して作成しようとしていますか? – slider

+0

いいえ、実際にシリアライザはPUTとPOSTで部分引数と部分引数では同じですが、その名前を変更するのは難しいです。 –

+0

さて、それは私には大丈夫です、ハハ。サンプルリクエストを投稿して、データが保存されていない場合でも返信してください。 – slider

答えて

4

createperform_createの両方を上書きしているようです。 があなたから継承したCreateModelMixinのコードを見ると、createはと呼ばれ、serializer.save()が呼び出されます。 createメソッドでperform_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

良い答えだった、部分的に私を助けた。 –

関連する問題