不管出于什么原因,当我刚接触 Python 和 Django 时,我在 models.py 文件的顶部编写了一些像这样的导入语句:
from django.contrib import auth
我会这样使用它:
class MyModel(models.Model):
user = models.ForeignKey(auth.models.User)
# ...
这很好用。很长一段时间后,我写了一个自定义管理命令,它会这样做:
from myapp.models import MyModel
当我运行自定义命令时(python manage.py my_command
)这会导致Python抱怨该模块auth
没有属性models
在线声明ForeignKey
在 models.py 中。
为了解决这个问题,我将 models.py 更改为更常见的:
from django.contrib.auth.models import User
class MyModel(models.Model):
user = models.ForeignKey(User)
# ...
有人可以向我解释我缺少什么吗?运行管理命令时环境是否有不同?还是我一直以来都做错了?谢谢!
Edit:根据 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)
以下是发现问题的管理命令的导入:
import datetime
from django.core.management.base import NoArgsCommand
from core.models import UserLastVisit, AnonLastVisit, Statistic
这是建立循环导入类型的情况吗?