Django rest framework drf壮观:如何在Swagger的示例部分显示主键

Django rest framework drf壮观:如何在Swagger的示例部分显示主键,django-rest-framework,swagger-ui,drf-spectacular,Django Rest Framework,Swagger Ui,Drf Spectacular,我试图在Swagger的示例部分显示主键,我使用的代码如下所示: 序列化程序.py class SerializerExample(serializers.ModelSerializer): class Meta: model = Book fields = ('id','name') Views.py class BooksBulkUpdate(APIView): @extend_schema( request=Serializ

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

序列化程序.py

class SerializerExample(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('id','name')
Views.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()
只有名称字段显示:


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

AFAIK swagger显示了输入请求模式

例如,您希望添加新的
人员
,并且您的模型是

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=30)
所以您只允许设置
name
参数

即使你发帖

{
“id”:“someUUID”,
“名称”:“名称”,
}
id
将被忽略,Django将通过自己的逻辑自动创建它(因为它是只读的)

但您可以将
id
字段设置为可写:

class SerializerExample(serializers.ModelSerializer):
id=序列化程序.UUIDField(仅写=True)
name=serializers.CharField(write_only=True)
类元:
模特=人
字段=('id','name')
write_only=True
表示当您保存新数据并从请求json接收
id
时,该字段将处于活动状态。 在相反的
read_only=True
中,将在响应时打印
id
字段(如果您尝试获取数据),但在保存新数据时忽略它

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


不确定此理论是否适用于您的情况,但希望这会有所帮助。

默认情况下,
id
是一个“只读”字段,在API请求期间不应更改该字段。即使您使用
id
字段发送有效负载,DRF也会优雅地忽略它。话虽如此,在您的招摇过市规范中表示
id
或在payloadMy endpoint中发送它是没有用的。我的端点不会改变id,但我需要id来知道要更新哪本书。我的端点同时更新了一批书籍。因此,您计划在DRF端接受
id
值?是的,我已更新了问题,以显示view.py codeIMHO的更详细示例,
inline serializer
是您的最佳解决方案我理解您的意思,但我需要在正文中接收id的原因是因为我的端点看起来像/books/bulk\u update,它的作用是同时更新一批书籍,而不是多次调用/books/之类的内容。可能有更好的方法进行批量更新,但这就是为什么我需要向API用户显示他们需要在主体中添加id的原因。