ImportError: cannot import name 'MealSerializer' from partially initialized module 'delivery_api.main.serializers'

Когда я вставляю эту строку cart = CartSerializer() в свой сериализатор для получения подробной информации, я получаю ошибку ImportError: cannot import name 'MealSerializer' from partially initialized module 'delivery_api.main.serializers' (most likely due to a circular import). В чем причина и как ее решить?

cart/serializers.py

class CartMealSerializer(serializers.ModelSerializer):

    meal = MealSerializer()

    class Meta:
        model = CartMeal
        fields = ['id', 'meal', 'qty', 'final_price']

class CartSerializer(serializers.ModelSerializer):

    meals = CartMealSerializer(many=True)
    owner = CustomerSerializer()

    class Meta:
        model = Cart
        fields = '__all__'

main/serializers.py

class OrderSerializer(serializers.ModelSerializer):

    cart = CartSerializer() *<--- This line causes an error*

    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'cart', 'phone', 'address', 'status', 'created_at']

Пожалуйста, помогите мне решить эту проблему

Вы имеете (скорее всего) два файла, которые пытаются импортировать друг друга. Это не имеет смысла, поскольку ваш модуль main.serializers направлен на импорт CartSerializer, расположенного в модуле cart.serializers, а модуль cart.serializer направлен на импорт MealSerializer, определенного в main.serializers.

Также не имеет смысла, чтобы два сериализатора импортировали друг друга: это обычно приводит к бесконечной рекурсии, когда сериализатор Meal сериализует свой Order, а тот сериализует связанные Meal. Если вы будете сериализовать его таким образом, это будет означать, что у вас бесконечная рекурсия, и, таким образом, будет создан файл с бесконечными каскадами, то есть что-то вроде { 'cart': { 'meals': { 'meal': { 'cart': { 'meals': { 'meal': { … } } } } } } }.

Таким образом, вам следует определить сериализаторы, которые не используют другой сериализатор, и использовать это для определения ограниченного числа итераций. Например, определив SimpleMealSerializer в верхней части модуля cart.serializers, который не делает лишних субсериализаций, так что что-то вроде:

# cart/serializers.py

# no import of the MealSerializer

class SimpleMealSerializer(serializers.ModelSerializer):

    class Meta:
        model = Meal
        fields = ['title', 'description', 'price']

class CartMealSerializer(serializers.ModelSerializer):
    meal = SimpleMealSerializer()

    class Meta:
        model = CartMeal
        fields = ['id', 'meal', 'qty', 'final_price']

class CartSerializer(serializers.ModelSerializer):
    meals = CartMealSerializer(many=True)
    owner = CustomerSerializer()

    class Meta:
        model = Cart
        fields = '__all__'
Вернуться на верх