drf-spectacular:如何在 Swagger

问题描述

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

Serializers.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()

显示名称字段:

enter image description here

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

解决方法

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 表示当您保存新数据并从请求 json 接收 id 时该字段将处于活动状态。 相反,read_only=True 将在响应时打印 id 字段(如果您尝试获取数据)但在保存新数据时忽略它。

所以你尝试描述数据添加的API,当然不允许在请求json中设置id字段。

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