Django REST框架ModelSerializer - 对象未保存

时间:2016-05-27 15:33:01

标签: python django django-rest-framework

我是一个模型,其中一个字段指的是一个覆盖的用户实例(在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方法,似乎我的自定义图像处理被阻止了从要创建的新对象...改变它,现在有效。

1 个答案:

答案 0 :(得分:4)

您似乎凌驾于createperform_create。如果您查看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) ,请执行以下操作:

from bs4 import BeautifulSoup
import requests 


def getPhoneStats(url):
    try:
        request= requests.get(url)
        if request.status_code == 200:
            soup = BeautifulSoup(request.content,"html.parser")

            for table in soup.findAll("table"):
                header = table.th.get_text()
                for row in table.findAll("tr"):
                    out_row = [ header ]
                    for col in row.findAll("td"):
                        out_row.append(col.get_text())
                    print(out_row)
        else:
            print('unable to connect ')
    except requests.HTTPError as e:
        print('Unable to open url',e)

if __name__ == "__main__":
    getPhoneStats('''http://www.gsmarena.com/lenovo_k3_note-7147.php''')