如何解决循环导入?

用户名

看来我有一个循环导入错误。我目前只是在努力修复它。有谁知道我该怎么办?

在我的models.py中,包含ReservedItems和Order:

def reserveditem_pre_save_receiver(sender, instance, **kwargs):
    if not instance.order_reference:
        instance.order_reference = unique_order_reference_generator()

在我的utils.py中

from lumis.utils import get_random_string
from .models import Order, ReservedItem


def unique_order_reference_generator():

    new_id = get_random_string(length=10)

    reserved_item = ReservedItem.objects.filter(
        order_reference=new_id
    ).exists()
    order = Order.objects.filter(order_reference=new_id).exists()

    if reserved_item or order:
        return unique_order_reference_generator()
    else:
        return new_id
威廉·范昂塞姆

您可以在函数主体中本地导入模块,因此:

from lumis.utils import get_random_string


def unique_order_reference_generator():
    from .models import Order, ReservedItem

    new_id = get_random_string(length=10)

    reserved_item = ReservedItem.objects.filter(
        order_reference=new_id
    ).exists()
    order = Order.objects.filter(order_reference=new_id).exists()

    if reserved_item or order:
        return unique_order_reference_generator()
    else:
        return new_id

因此,这意味着在Python加载文件时不会加载模块,而是在实际调用函数时加载模块结果,我们可以加载该unique_order_reference_generator函数,而不必加载实际上依赖于此函数的模块。

请注意,就像@Alasdair所说的那样,信号通常是在专用文件(signals.py)中定义的,例如,应将其加载ready()到应用程序功能中。但是,无论您如何构造代码,都应经常使用本地导入来避免循环导入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章