[英]Django REST Framework ModelSerializer - Object not saved
我有一個模型,其中一個字段引用了一個覆蓋的User實例(在Django設置中已更改)。
當我從客戶端執行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
實例注入序列化器,並要求它創建對象。 那沒事 沒有異常發生,它返回正確的數據,但是對象不在我的數據庫中,沒有被保存。
這里有什么問題?
編輯 :
當我將owner
字段添加到CatPutSerializer時,它會引發安全問題,因為我不知道如何防止更改此字段,因為我不希望客戶端向我發送要分配的用戶。 當我復制僅用於POST請求的序列化程序時,它說它錯過了owner
字段...
這是CatPutSerializer
:
class CatPutSerializer(serializers.ModelSerializer):
class Meta:
model = Cat
fields = ('name', 'weight', 'sterilized', 'image', 'tag', 'dob', 'race', 'gender')
更新 :
按照建議,我現在做如下:
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本身有關,因此我檢查了Django模型的save
方法,似乎我的自定義圖像處理阻止了新對象的創建...現在對其進行了更改作品。
您似乎同時覆蓋了create
和perform_create
。 如果查看ModelViewSet
繼承的CreateModelMixin的代碼,您會注意到create
調用perform_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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.