簡體   English   中英

Django REST Framework ModelSerializer-未保存對象

[英]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方法,似乎我的自定義圖像處理阻止了新對象的創建...現在對其進行了更改作品。

您似乎同時覆蓋了createperform_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM