(一) DRF depth=1的情况下对象的创建与更新问题

    科技2023-10-11  102

    当序列化类MATE中定义了depth时,这个序列化类中引用字段(外键)则自动变为只读,所以进行更新或者创建操作的时候不能使用此序列化类

    具体方法是这样的分别定义两个序列化类,判断request的方法并选择,直接上代码:

    serializers.py

    # ==== 一旦有了depth,引用的字段就变为只读了 ==== class GetSetSerializer(serializers.ModelSerializer): class Meta: model = Set fields = '__all__' depth = 1 # ==== 这个序列化类没有depth ==== class UpdateSetSerializer(serializers.ModelSerializer): class Meta: model = Set fields = '__all__'

    views.py

    class SetViewSet(viewsets.ModelViewSet): """ A viewset that provides default `create()`, `retrieve()`, `update()`, `partial_update()`, `destroy()` and `list()` actions. """ queryset = Set.objects.all() filter_backends = (DjangoFilterBackend, OrderingFilter) filter_fields = ('production__name', 'available_zone__name', 'trash') # 此处区分请求的HTTP1.1方法 def get_serializer_class(self): serializer_class = self.serializer_class if self.request.method in ('PUT', 'PATCH','POST'): serializer_class = UpdateSetSerializer if self.request.method == 'GET': serializer_class = GetSetSerializer return serializer_class

    在进行put、patch、post请求时,会直接使用UpdateSetSerializer,这样外键数据部分使用外键对应id即可

    在进行get请求时,会直接使用GetSetSerializer,这样接口响应中会将外键数据同样显示出来

    这样完美满足我们对应接口请求的需求

    Processed: 0.010, SQL: 8