モデルがあり、そのフィールドの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
方法をチェックし、私のカスタム画像処理を防止ようです新しいオブジェクトを作成する...それを変更し、今すぐ動作します。
PUTを使用して作成しようとしていますか? – slider
いいえ、実際にシリアライザはPUTとPOSTで部分引数と部分引数では同じですが、その名前を変更するのは難しいです。 –
さて、それは私には大丈夫です、ハハ。サンプルリクエストを投稿して、データが保存されていない場合でも返信してください。 – slider