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__'