我似乎有一个循环导入错误。我目前正在努力解决它。有谁知道我应该做什么?
在我的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
答案 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
函数中加载。但无论您如何构建代码,通常都应使用本地导入来避免循环导入。