【问题标题】:Django ORM on Standalone Applications独立应用程序上的 Django ORM
【发布时间】:2012-06-05 23:05:09
【问题描述】:

我按照这个link 在python 中的独立应用程序上使用了Django 的ORM。 manage.py sql 'application_name' 和 manage.py syncdb 运行良好,并且在我执行 syncdb 时创建了表。我遇到的问题是,当我运行将处理 DB 事务的实际脚本(在本例中为 dparser.py)时,我遇到了“TypeError:相对导入需要 'package' 参数”。下面是堆栈跟踪:

Traceback (most recent call last):
  File "dparser.py", line 23, in <module>
    from dmodel.models import *
  File "/home/<user>/d/dapp/dmodel/models.py", line 1, in <module>
    from django.db import models
  File "/usr/local/lib/python2.7/site-packages/django/db/__init__.py", line 11, in <module>
    if DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
    self._setup()
  File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 93, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/local/lib/python2.7/site-packages/django/utils/importlib.py", line 28, in import_module
    raise TypeError("relative imports require the 'package' argument")
TypeError: relative imports require the 'package' argument

下面是我的settings.py、models.py和dparser.py的内容:

settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   
        'NAME': 'd',
        'USER': 'root',
        'PASSWORD': '<password>',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
INSTALLED_APPS = ("dapp.dmodel",)

models.py:

from django.db import models
from django.db.models import Max


class Topics(models.Model):
     topic_id = models.AutoField(primary_key=True)
     topic = models.CharField(max_length=1000)

class Links(models.Model):
     link_id = models.AutoField(primary_key=True)
     topic = models.ForeignKey(Topics)
     link = models.CharField(max_length=1000)

def getLastId(tag):
     ...
     return lastid

dparser.py(部分):

from django.conf import settings
os.environ['DJANGO_SETTINGS_MODULE'] = ".settings.py"
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   
        'NAME': 'd',
        'USER': 'root',
        'PASSWORD': '<password>',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}
INSTALLED_APPS = ("dapp.dmodel",)

from dmodel.models import * # --> This is were the exception occurs

希望有人可以帮助我。提前致谢!

【问题讨论】:

  • 我认为你不需要“from django.db.models import Max”这一行
  • 我需要它,因为我在 models.py 的 getLastId 函数上使用它
  • 我建议将 SQLAlchemy 用于独立应用程序。它与 Web 框架无关。

标签: python django orm


【解决方案1】:

查看引发 execption 的 django.utils.importlib.py 的代码,您会发现您的设置文件名导致了问题:

if name.startswith('.'):
    if not package:
        raise TypeError("relative imports require the 'package' argument")

不要使用.settings.py 作为设置文件的名称,使用不以“.”开头的名称。它会解决这个特定的错误。

【讨论】:

  • ROOT_URLCONF 设置也可能发生这种情况。如果您使用ROOT_URLCONF = os.path.basename(PATH) + '.urls' 之类的东西,您最终可能会得到'..urls' 之类的东西,这会引发错误。逐步浏览了 Django 源代码来解决这个问题!
【解决方案2】:

我猜你需要这样做

from dapp.dmodel.models import *

或设置 PYTHONPATHsys.path 以包含 dapp 文件夹。

【讨论】:

  • 嗯,太糟糕了 - 只是一个猜测。我现在仔细看看,看看我的其他答案,希望最终有所帮助!
猜你喜欢
  • 2012-07-02
  • 2015-08-19
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2011-10-16
相关资源
最近更新 更多