代码之家  ›  专栏  ›  技术社区  ›  dawid.pawlowski

在DRF中创建对象时如何更改相关对象

  •  0
  • dawid.pawlowski  · 技术社区  · 2 年前

    我想在创建预订时更改Book对象中的is_available字段。我找到了一种粘贴在这里的方法,但这个挖掘请求看起来很混乱,所以对于像drf这样成熟的框架来说,可能有更好的方法可以做到这一点。

    所以我有serializer.py

    class BookSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = BookModel
            fields = ["number", "title", "author", "is_available"]
    
    
    class ReservationSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = ReservationModel
            fields = ["reserved_by", "book", "started_at", "valid_until"]
    

    和视图.py

    class BookViewSet(viewsets.ModelViewSet):
        queryset = BookModel.objects.all()
        serializer_class = BookSerializer
        permission_classess = []
    
    
    class ReservationViewSet(viewsets.ModelViewSet):
        queryset = ReservationModel.objects.all()
        serializer_class = ReservationSerializer
        permission_classess = []
    
        def perform_create(self, request, *args, **kwargs):
            super().perform_create(request, *args, **kwargs)
            book = BookModel.objects.get(pk=request.data.serializer.instance.book_id)
            book.is_available = False
            book.save()
    

    我发布了我所做的,请教我做得更好——正确的方式

    2 回复  |  直到 2 年前
        1
  •  1
  •   Vlad Marchenko    2 年前

    .perform_create() 方法如下所示:

    def perform_create(self, serializer):
        serializer.save()
    

    它唯一的论点是 串行器 ,但不是 要求 因为它在你的代码中,没有*args和**kwargs。你可能把它和 创造 方法

    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)
    

    如果您想向perform_create方法添加逻辑,您应该执行以下操作:

    def perform_create(self, serializer):
        reservation = serializer.save()
        book = reservation.book 
        book.is_available = False
        book.save()