如何修复循环导入?

时间:2018-06-14 15:28:05

标签: django

我似乎有一个循环导入错误。我目前正在努力解决它。有谁知道我应该做什么?

在我的models.py中,包含ReservedItems&顺序:

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

2 个答案:

答案 0 :(得分:1)

所有目前的建议都很好。将信号处理程序移出模型。模型很容易进行循环导入,因为它们在任何地方都使用,因此最好只在models.py中保留模型代码。

就个人而言,我不喜欢代码中间的导入,所以我使用Django应用程序API来加载模型而不导入。

from django.apps import apps

def signal_handler(instance, *args, **kwargs):
    Order = apps.get_model('your_app', 'Order')
    ...

答案 1 :(得分:0)

您可以在函数正文中导入模块本地 ,所以:

procedure TForm1.Button1Click(Sender: TObject);
var
  vRequest : TStringStream;
  s : String;
begin
  IdHTTP1.Request.ContentType := edContentType.Text;
  IdHTTP1.Request.CustomHeaders.Values['SOAPAction'] := 'removed for safe';
  IdHTTP1.Request.CacheControl := 'no-cache';
  IdHTTP1.HTTPOptions := [hoKeepOrigProtocol];
  IdHTTP1.ProtocolVersion := pv1_1;

  Memo2.Clear;
  try
    vRequest := TStringStream.Create(Memo1.Lines.Text);
    try
      s := IdHTTP1.Post(Edit1.Text, vRequest);
    finally
      vRequest.Free;
    end;
    Memo2.Lines.Text := s;
  except
    on e: Exception do begin
      Label1.Caption := e.Message;
      Memo2.Lines.Text := e.Message;
    end;
  end;

  RequestHeaders.Lines.Assign(IdHTTP1.Request.RawHeaders);
  ResponseHeaders.Lines.Assign(IdHTTP1.Response.RawHeaders);
end;

这意味着当Python加载文件时,模块加载,但实际调用该函数时。因此,我们可以加载append函数,而无需加载实际依赖于此函数的模块。

请注意,就像@Alasdair所说,信号通常在专用文件(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)中定义,例如应该在应用程序的unique_order_reference_generator函数中加载。但无论您如何构建代码,通常都应使用本地导入来避免循环导入。