Django - manage.py sql APPNAME不生成模型SQL

时间:2013-08-19 23:20:04

标签: django django-models

我正在处理一个相对较大的平面应用程序。为了保持关注点的分离,我将模型和视图文件拆分为auth_modelsdashboard_modelstaxonomy_models等。这些已被放置在文件夹结构中

APPNAME/
  app/
    models/ 
      __init__.py
      auth_models.py
      dashboard_models.py
      taxonomy_models.py
      ...
    views/
      __init__.py
      dashboard_views.py
      taxonomy_views.py
      ...

我的app/models/__init__.py有以下内容:

from auth_models import *
from dashboard_models import *
from taxonomy_models import *

然而,当我运行./manage.py sql app时,我得不到任何输出。没有警告,什么都没有。

这个问题的原因是我正在实施数据库修改和迁移,其中南方无法处理多个方面。所以我基本上从一个新的架构开始,稍后将实现一个数据转换脚本来迁移现有的数据集。为此,我需要架构来创建模型表。

2 个答案:

答案 0 :(得分:3)

请参阅this回答。

Django根据模型所在的路径对您的应用名称进行假设,因此您不得不在这种情况下为每个导入的模型添加应用标签,如下所示:

class MyModel(Model):
    # Model fields
    class Meta:
        app_label = 'app'

<强>背景

在撰写本文时,Django有以下代码来检测模型的应用标签:

    if getattr(meta, 'app_label', None) is None:
        # Figure out the app_label by looking one level up.
        # For 'django.contrib.sites.models', this would be 'sites'.
        model_module = sys.modules[new_class.__module__]
        kwargs = {"app_label": model_module.__name__.split('.')[-2]}

由此,我们看到它从模块名称中推断出app_label,它可能存在于应用程序层次结构的深处。

答案 1 :(得分:2)

如果您的auth_models.py包含模型类MyUserModel,则需要将以下内容放在__init__.py下的app/models下:

try:
    from .auth_models import MyUserModel
except ImportError as e:
    sys.stderr.write("Error: failed to import models module ({})".format(e))

P.S。另一个建议是改进您为文件命名的样式。由于auth_models.pydashboard_models.pytaxonomy_models.py都在app/models下,因此您可以简单地截断_models.py个结尾。即在/models下重命名您的文件:

auth_models.py -> auth.py
dashboard_models.py -> dashboard.py
taxonomy_models.py -> taxonomy.py

按照上面的说明导入Model类:

from .auth import MyUserModel