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

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

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

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

Foo(User first_user, User second_user)

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

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

    Foo (FirstUser first_user, SecondUser second_user)

Что нужно сделать, чтобы иметь как работающий повтор c, так и сгенерированные классы, как и ожидалось?

1 Ответ

1 голос
/ 23 января 2020

В соответствии с drf-yasg docs здесь , вы можете указать 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")
...