Класс не видит другого класса, как это исправить?

#python #class #django-rest-framework

Вопрос:

первый класс использует объект второго класса, и наоборот, как это исправить? Есть ли для этого какой-нибудь трюк?

Ошибка: Ошибка имени: имя «акторсериализатор» не определено

   class FilmSerializer(serializers.ModelSerializer):
    extrainfo = InfoSerializer(many=False)
    recenzje = RecenzjeSerializer(many=True)
    aktorzy = AktorSerializer(many=True)

    class Meta:
        model = Film
        fields = ('id', 'nazwa', 'opis', 'rok', 'rating', 'extrainfo', 'recenzje', 'aktorzy')


class AktorSerializer(serializers.ModelSerializer):
    filmy = FilmSerializer(many=True)

    class Meta:
        model = Aktor
        fields = ('imie', 'filmy')
 

Комментарии:

1. Вам не понравится такая структура сериализатора, как эта, поскольку они взаимно рекурсивны. Вы получите бесконечно глубокий результат.

2. Это для учебных целей, я только начал использовать drf и пробовать кое-что новое, но спасибо за совет, что я должен сделать лучше здесь?

Ответ №1:

Как упоминалось в моем комментарии, наличие взаимно рекурсивных сериализаторов приведет к тому, что DRF попытается сгенерировать бесконечно глубокий рекурсивный вывод:

 film: Film 1
  film.aktorzy[0]: Actor 1
    film.aktorzy[0].filmy[0]: Film 1
      film.aktorzy[0].filmy[0].aktorzy[0]: Actor 1
        film.aktorzy[0].filmy[0].aktorzy[0].filmy[0]: Film 1
          ...
 

Вам, вероятно, понадобится другой сериализатор для актеров в фильмах; это также устранит вашу первоначальную проблему.

 class AktorWithoutFilmsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Aktor
        fields = ("imie",)


class FilmSerializer(serializers.ModelSerializer):
    extrainfo = InfoSerializer(many=False)
    recenzje = RecenzjeSerializer(many=True)
    aktorzy = AktorWithoutFilmsSerializer(many=True)

    class Meta:
        model = Film
        fields = (
            "id",
            "nazwa",
            "opis",
            "rok",
            "rating",
            "extrainfo",
            "recenzje",
            "aktorzy",
        )


class AktorSerializer(serializers.ModelSerializer):
    filmy = FilmSerializer(many=True)

    class Meta:
        model = Aktor
        fields = ("imie", "filmy")