【问题标题】:drf-spectacular: how to show the primary key in examples section of Swaggerdrf-spectacular:如何在 Swagger 的示例部分中显示主键
【发布时间】:2021-05-14 09:09:23
【问题描述】:

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

序列化器.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()

仅显示名称字段:

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

【问题讨论】:

  • id 是一个“只读”字段,默认情况下,不应在 API 请求期间更改。即使您发送带有id 字段的有效负载,DRF 也会优雅地忽略它。话虽如此,在您的 swagger 规范中表示 id 或在有效负载中发送它是没有用的
  • 我的端点不会改变 id,但我需要 id 才能知道要更新哪本书。我的端点同时更新了一批图书。
  • 那么,您打算在 DRF 端接受 id 值吗?
  • 是的,我已更新问题以显示 view.py 代码的更详细示例
  • 恕我直言,inline serializer 是最适合您的解决方案

标签: django-rest-framework swagger-ui drf-spectacular


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

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

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

【讨论】:

  • 我明白你的意思,但我需要在正文中接收 id 的原因是因为我的端点看起来像 /books/bulk_update 什么是同时更新一批书,而不是多次调用 /books/ 之类的东西。可能有更好的方法进行批量更新,但这就是为什么我需要向我的 API 用户展示他们需要在正文中添加 id 的原因。
猜你喜欢
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2021-02-09
  • 2022-07-12
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多