使用Django管理命令的Python导入问题

Bri*_*eal 4 python django import

无论出于何种原因,当我不熟悉Python和Django时,我在models.py文件的顶部写了一些这样的import语句:

from django.contrib import auth
Run Code Online (Sandbox Code Playgroud)

我会像这样使用它:

class MyModel(models.Model):
    user = models.ForeignKey(auth.models.User)
    # ...
Run Code Online (Sandbox Code Playgroud)

这很好.很久以后,我写了一个自定义管理命令,它会这样做:

from myapp.models import MyModel
Run Code Online (Sandbox Code Playgroud)

当我运行我的自定义命令(python manage.py my_command)时,这将导致Python抱怨该模块authmodels声明ForeignKeymodels.py中的行上没有属性.

要解决此问题,我将models.py更改为更常见的:

from django.contrib.auth.models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)
    # ...
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释我错过了什么吗?运行管理命令时,环境中是否存在不同之处?或者我一直都做错了?谢谢!

编辑:在dmitko关于循环导入的预感之后,这里是我的models.py文件中使用的导入.我正在显示auth注释掉的原始导入,以及唯一具有auth用户模型外键的模型:

import datetime  
from django.db import models 
# from django.contrib import auth
from django.contrib.auth.models import User 

class UserLastVisit(models.Model):
    # user = models.ForeignKey(auth.models.User, unique=True)
    #                          ^^^^^^^^^^^^^^^^
    # after adding mgmt command, error occurred here; change to the line below
    user = models.ForeignKey(User, unique=True)
    last_visit = models.DateTimeField(db_index=True)
Run Code Online (Sandbox Code Playgroud)

以下是发现问题的管理命令的导入:

import datetime   
from django.core.management.base import NoArgsCommand 
from core.models import UserLastVisit, AnonLastVisit, Statistic
Run Code Online (Sandbox Code Playgroud)

这是否设置了循环导入类型的情况?

ape*_*arr 5

如果某个随机模块导入模块x.y.z,则后来导入的人x.yzx.y命名空间中看到a .

发生这种情况的原因import x.y.z实际上是三个import语句.它的工作原理如下:

x = __internal_import('x')
x.y = __internal_import('x/y')
x.y.z = __internal_import('x/y/z')
Run Code Online (Sandbox Code Playgroud)

下次有人这样做时__internal_import('x/y'),他们会获得相同的对象,因为python足够智能,不会导入相同的两次.该对象已将其z成员分配给该z模块.

在你的完整应用程序中,可能你有一个模块import django.contrib.auth.models.但是您的最小独立程序没有导入该模块,因此从未分配过该名称.

(注意:没有这样的东西__internal_import.这只是一个例子.真正的函数有一些你必须要查找的其他名称.)