Проблема повторного использования сериализаторов с django и drf-yasg

Я использую 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, я вижу, что:

  1. first_user и second_user имеют одинаковое имя ссылки ($ref)
  2. Описание second_user и redoc читается как "первый пользователь", а не второй пользователь. это потому, что описание взято из $ ref, у которого есть первое описание пользователя.

Я заметил, что если я удостоверяюсь, что имена ссылок различны, то redoc читается нормально, поскольку first_user и second_user получают собственное описание. Проблема возникает из-за того, что я также хочу иметь возможность позже использовать кодогенерацию swagger для создания заглушек Java, поэтому решение и, насколько я понимаю, существуют разные классы для каждого отдельного имени ссылки. В идеале я бы увидел, что вызов foo выглядит примерно так:

Foo(User first_user, User second_user)

Это подводит меня к проблеме:

  • Если first_user и second_user имеют одно и то же имя ссылки, то redoc читается неправильно, и второй пользователь имеет описание первого пользователя.
  • Если first_user и second_user имеют разные имена ссылок, тогда redoc работает, но я получаю два разных класса, скажем

    Foo(FirstUser first_user, SecondUser second_user)

Что мне нужно для того, чтобы как рабочие, так и сгенерированные классы были как и ожидалось?

1 ответ

Согласно документации drf-yasg здесь, вы можете указать ref_name в классе Meta сериализатора. Следовательно, должно работать что-то вроде этого (хотя и не очень чистое решение):

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")
Другие вопросы по тегам