Python导入Django管理命令的问题

2024-05-01

不管出于什么原因,当我刚接触 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

这是建立循环导入类型的情况吗?


如果某个随机模块曾经导入模块x.y.z,然后一个后来的人只导入x.y将会看到一个z in the x.y命名空间。

出现这种情况的原因是import x.y.z实际上是三个 import 语句合二为一。它的工作原理是这样的:

x = __internal_import('x')
x.y = __internal_import('x/y')
x.y.z = __internal_import('x/y/z')

下次有人这样做的时候__internal_import('x/y'),他们会得到相同的对象,因为 python 足够聪明,不会两次导入相同的对象。该对象已经有它的z分配给的成员z module.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python导入Django管理命令的问题 的相关文章

随机推荐