0

我试图在 Swagger 的示例部分中显示主键,我使用的是drf-spectacular,我的代码如下所示:

序列化器.py

class SerializerExample(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('id','name')

视图.py

class BooksBulkUpdate(APIView):
    @extend_schema(
        request=SerializerExample(many=True),
        responses={200:''},
    )
    def put(self, request, format=None):
        with transaction.atomic():
            for data in request.data:
                book = Book.objects.get(pk=data['id'])
                serializer = SerializerExample(book, data=data, partial=True)
                if serializer.is_valid():
                    serializer.save()
                else:
                    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return Response()

仅显示名称字段:

在此处输入图像描述

我发现的唯一解决方案是使用内联序列化程序,这不是理想的解决方案,因为如果我更新我的书序列化程序,我必须记住也要更新这个内联序列化程序。我想知道是否有更好的方法来做到这一点。

4

1 回答 1

1

AFAIK swagger 显示输入请求模式。

例如,您要添加新person的并且您的模型是

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=30)

所以你只允许设置name参数

即使你发帖

{
  "id": "someUUID",
  "name": "NAME",
}

id将被忽略,Django 通过自己的逻辑自动创建它(因为它是只读的)

但是您可以设置id字段可写:

class SerializerExample(serializers.ModelSerializer):

    id = serializers.UUIDField(write_only=True)
    name = serializers.CharField(write_only=True)

    class Meta:
        model = Person
        fields = ('id','name')

write_only=True意味着当您保存新数据并id从请求 json 接收时,该字段将处于活动状态。相反,read_only=True将在响应时打印id字段(如果您尝试获取数据),但在保存新数据时忽略它。

因此,您尝试描述用于添加数据的 API,当然这不允许id在请求 json 中设置字段。

不确定该理论是否适用于您的案例,但希望对您有所帮助。

于 2021-05-14T10:02:21.107 回答