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

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 模块旨在导入位于 cart.serializers 模块中的 CartSerializer,而 cart.serializer 模块旨在导入定义的 MealSerializermain.serializers.

两个序列化器相互导入也是没有意义的:这通常会导致无限递归,其中 Meal 的序列化器序列化其 Order 并且将序列化相关的 Meal秒。如果你像那样序列化它,那意味着你有无限递归,因此会生成一个具有无限级联的文件,所以像 { 'cart': { 'meals': { 'meal': { 'cart': { 'meals': { 'meal': { … } } } } } } }.

因此,您应该定义不使用其他序列化程序的序列化程序,并使用它来定义有限 次迭代。例如,通过在 cart.serializers 模块的顶部定义一个 SimpleMealSerializer,它不会进行额外的子序列化,所以类似于:

# cart/serializers.py

# <strong>no</strong> import of the MealSerializer

class SimpleMealSerializer(serializers.ModelSerializer):

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

class CartMealSerializer(serializers.ModelSerializer):
    meal = <strong>SimpleMealSerializer()</strong>

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