Django rest framework drf壮观:如何在Swagger的示例部分显示主键
我试图在Swagger的示例部分显示主键,我使用的代码如下所示: 序列化程序.pyDjango 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
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的原因。