class ReviewCreate(generics.CreateAPIView):
# queryset=Review.objects.all()
serializer_class=ReviewSerializer
def perform_create(self, serializer):
pk=self.kwargs.get('pk')
# print(pk)
watchlist=WatchList.objects.get(pk=pk)
serializer.save(watchlist=watchlist)
print("1")
在serializer.save(watchlist=watchlist)行中,为什么传递了watchlist=watchlist。当我进入REST框架泛型类的CreateAPIView类时,实现了post方法,并从那里进入mixins类,其中create方法是这样实现的。
class CreateModelMixin:
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
当控制转到perform_create函数时,它将数据保存在DB中,但在我们的www.example.com中views.py,我们再次执行serializer.save(watchlist=watchlist)。
然后,为什么我们这样做,以及如何在数据库中创建数据,只有观察列表字段值,而审查模型也有其他字段。请帮助
1条答案
按热度按时间dsekswqp1#
流程如下:
serializer.save(watchlist=watchlist)
/调用BaseSerializer.save()validated_data = {**self.validated_data, **kwargs}
(将监视列表添加到其余数据)self.create(validated_data)
/调用ModelSerializer.save()ModelClass._default_manager.create(**validated_data)
使用vanilla Django发布到数据库因此,当您只添加WatchList字段时,它可以工作的原因是因为这一行:
它预先打包了你所有的数据。
由于覆盖了默认的
preform_create
方法,因此实际上只调用了该.save()
方法一次(在ReviewCreate.preform_create
中)。