Проблема повторного использования сериализаторов с 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, я вижу, что:
- first_user и second_user имеют одинаковое имя ссылки ($ref)
- Описание 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")