Вызов класса, находящегося ниже другого класса

Я работаю над проектом django с rest_framework и у меня возникла проблема с сериализаторами. Вот мой код:

class CategorySerializer(serializers.ModelSerializer):
    featured_product = ProductSerializer(read_only=True)
    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]

class ProductSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)
    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]

Как вы видите, в ProductSerializer я использую CategorySerializer, а также в CategorySerializer мне нужно использовать ProductSerializer. если я запущу код, то получу NameError: name 'ProductSerializer' is not defined.

Первая попытка:
Я попытался записать их в два разных файла и импортировать их сверху обоих файлов, но я получил Circular Import ошибку
Вторая попытка:
Я определил пустой класс с именем ProductSerializer класс в верхней части моего кода, но это не сработало.

Если вы достигнете искомого, это закончится бесконечным процессом сериализатора: CategorySerializer -> .featured_product -> ProductSerializer -> .category -> CategorySerializer -> .featured_product -> ProductSerializer -> ...

Чтобы избежать этого, лучше создать дополнительные сериализаторы, например:

class ProductListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = [
            'title',
            'price',
        ]


class CategoryListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = [
            'title',
        ]


class CategorySerializer(serializers.ModelSerializer):
    featured_product = ProductListSerializer(read_only=True)

    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]


class ProductSerializer(serializers.ModelSerializer):
    category = CategoryListSerializer(read_only=True)

    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]

Но если вы действительно хотите иметь круговую связь, вы можете сделать это, используя SerializerMethodField, например:

class CategorySerializer(serializers.ModelSerializer):
    featured_product = serializers.SerializerMethodField()

    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]

    def get_featured_product(self, obj):
        return ProductSerializer(obj.featured_product).data


class ProductSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)

    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]
Вернуться на верх