django 我不知道这行代码是如何工作的

ogsagwnx  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(127)
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)。
然后,为什么我们这样做,以及如何在数据库中创建数据,只有观察列表字段值,而审查模型也有其他字段。请帮助

dsekswqp

dsekswqp1#

流程如下:

  • 创建模型混合。创建**(rest_framework/mixins.py)**
  • 使用POST数据初始化串行器
  • 验证
  • 调用ReviewCreate.perform_create**(您覆盖了默认的preform_create)**
  • ReviewCreate.preform_create
  • serializer.save(watchlist=watchlist)/调用BaseSerializer.save()
  • BaseSerializer.save()(rest_framework/serializers.py)
  • validated_data = {**self.validated_data, **kwargs}(将监视列表添加到其余数据)
  • self.create(validated_data)/调用ModelSerializer.save()
  • ModelSerializer.save()(rest_framework/serializers.py)
  • ModelClass._default_manager.create(**validated_data)使用vanilla Django发布到数据库

因此,当您只添加WatchList字段时,它可以工作的原因是因为这一行:

class CreateModelMixin:
    def create(self, request, *args, **kwargs):
        # \/ <-- HERE!                      \/ <-- This!
        serializer = self.get_serializer(data=request.data)

它预先打包了你所有的数据。
由于覆盖了默认的preform_create方法,因此实际上只调用了该.save()方法一次(在ReviewCreate.preform_create中)。

相关问题