django - 使用 django 和 drf-yasg 重用序列化程序的问题

标签 django django-rest-framework swagger drf-yasg redoc

我正在使用 django、django drf 和 drf-yasg 来生成编写我的 BE 并生成文档。

我有一个名为 User 的模型和一个用于用户的序列化程序:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = users_models.User
        fields = (users_models.User.first_name.field_name,
                  users_models.User.last_name.field_name,)

我有一些方法 Foo 可以获得两个用户。这是请求的序列化程序的样子:
class FooRequestSerializer(serializers.ModelSerializer):
      first_user = UserSerializer(help_text="first user")
      second_user = UserSerializer(help_text="second user")

当我为此生成一个swagger json方案时,我查看了json和redoc,我看到了:
  • first_user 和 second_user 具有相同的引用名称 ($ref)
  • second_user 和 redoc 的描述为“第一个用户”而不是第二个用户。这是因为描述取自具有第一个用户描述的 $ref。

  • 我注意到如果我确保 ref 名称是不同的,那么 redoc 读起来很好,因为 first_user 和 second_user 得到了他们自己的描述。
    问题来了,因为我也希望以后能够使用 swagger codegen 来创建 Java stub ,所以解决方案和据我所知,每个不同的 ref 名称都有一个不同的类。
    理想情况下,我会看到对 foo 的调用类似于
    Foo(User first_user, User second_user)
    

    这让我想到了一个问题:
  • 如果 first_user 和 second_user 具有相同的引用名称,则 redoc 读取错误并且第二个用户具有第一个用户描述。
  • 如果 first_user 和 second_user 具有不同的 ref 名称,那么 redoc 可以工作,但我会生成两个不同的类,例如

    Foo(FirstUser first_user, SecondUser second_user)

  • 我需要做什么才能按预期工作重文档和生成的类?

    最佳答案

    根据 drf-yasg 文档 here ,你可以在serializer的Meta类中指定一个ref_name。因此,这样的事情应该工作(虽然不是很干净的解决方案):

    class UserSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = users_models.User
            fields = (users_models.User.first_name.field_name,
                      users_models.User.last_name.field_name,)
    
    
    class FirstUserSerializer(UserSerializer):
        class Meta:
            ref_name = "User 1"
    
    
    class SecondUserSerializer(UserSerializer):
        class Meta:
            ref_name = "User 2"
    
    
    class FooRequestSerializer(serializers.ModelSerializer):
          first_user = FirstUserSerializer(help_text="first user")
          second_user = SecondUserSerializer(help_text="second user")
    

    关于django - 使用 django 和 drf-yasg 重用序列化程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59885543/

    相关文章:

    python - DRF-通过模型在 M2M 中创建新实例时出错

    python - 在 Django 中模拟 POST 请求

    django - "This field is required."DRF

    django - 在 Django Rest Framework 中注销

    swagger - 是否有任何支持OpenAPI 3的生成器?

    java - Swagger + Spring安全性-基于角色的隐藏方法

    java - Swagger-ui.html 不显示 api 列表

    python - 在同一台服务器上运行 Django 1.5 和 Django 1.3

    Django: "order"基于 bool 字段的查询集

    python - 在 Django Rest Framework 中接受 URL 或 PK 作为过滤器