我是一个模型,其中一个字段指的是一个覆盖的用户实例(在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
方法,似乎我的自定义图像处理被阻止了从要创建的新对象...改变它,现在有效。
答案 0 :(得分:4)
您似乎凌驾于create
和perform_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''')