【问题标题】:ImportError: cannot import name 'MealSerializer' from partially initialized module 'delivery_api.main.serializers'ImportError:无法从部分初始化的模块“delivery_api.main.serializers”导入名称“MealSerializer”
【发布时间】:2021-09-14 06:30:38
【问题描述】:

当我将此行 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']

请帮我解决这个问题

【问题讨论】:

  • 您的MealSerializer 可能与OrderSerializer 定义在同一个模块中,因此您有两个相互引用的序列化程序。
  • 我将 OrderSerializer 移动到 cart/serializers.py 并解决了我的问题,谢谢

标签: django django-rest-framework django-serializer


【解决方案1】:

您在这里(可能)有两个文件尝试相互导入。这是没有意义的,因为您的main.serializers 模块旨在导入位于cart.serializers 模块中的CartSerializer,而cart.serializer 模块旨在导入在main.serializers 中定义的MealSerializer

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多