【问题标题】:Django: models aren't being recognized by syncDB or south after they have been refactored into separate filesDjango:将模型重构为单独的文件后,syncDB 或 south 无法识别模型
【发布时间】:2011-08-06 07:04:17
【问题描述】:

我有一个包含所有类和东西的大型模型文件,很难在一个文件中维护所有内容。所以我将它重构为一个模型文件夹,init.py 并为每个类创建一个文件。

然后我做了

manage_noDebug.py schemamigration picviewer --auto
manage_noDebug.py schemamigration migrate picviewer

and south 从数据库中删除了这些表,但没有像我想的那样添加 model_* 表。我现在可以让它提取我的模型文件吗?

manage_noDebug.py sql picviewer

上面的输出是空的

我的文件夹结构是:

图片查看器 /楷模/ 初始化.py 图片.py paperType.py ...

其中一个文件类是:

class cartItem(models.Model):
    picture = models.ForeignKey('Picture', null=False)
    paperType = models.ForeignKey('paperType', null=False)
    printSize = models.ForeignKey('printSize', null=False)
    quantity = models.IntegerField(default=1, validators=[validators.MinValueValidator(1)])
    price = models.DecimalField(decimal_places=2,max_digits=8)
    dateCreated = models.DateTimeField(null=False)
    sessionKey = models.ForeignKey(Session, to_field="session_key", null=False)
    user = models.ForeignKey(User,null=True)

    class Meta:
        app_label = 'picviewer'

设置安装的应用程序:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'picviewer',
    'south'
)

我尝试从项目目录中删除 /migrations/ 目录并运行 syncdb:

D:\~Sasha\eclipse_workspace\zavalen>manage_noDebug.py syncdb
Syncing...
No fixtures found.

Synced:
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > django.contrib.admin
 > picviewer
 > south

Not synced (use migrations):
 -
(use ./manage.py migrate to migrate these)

看起来“本机”syncDB 或 south schemamigration 都没有看到我的模型。

这是 dbShell 的表输出:

D:\~Sasha\eclipse_workspace\zavalen>manage_noDebug.py dbshell
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log
auth_message                django_content_type
auth_permission             django_session
auth_user                   django_site
auth_user_groups            south_migrationhistory
sqlite>

这是我的模型文件夹的目录:

D:\~Sasha\eclipse_workspace\zavalen\picviewer\models>dir *.py
Directory of D:\~Sasha\eclipse_workspace\zavalen\picviewer\models

15.04.2011  16:38             1 125 cartItem.py
15.04.2011  16:43             1 283 Collection.py
15.04.2011  16:40               419 ImageSizeRatio.py
15.04.2011  16:43               876 Menu.py
15.04.2011  16:43             1 667 Order.py
15.04.2011  14:07             1 457 OrderForm.py
15.04.2011  16:43               490 OrderStatusHistory.py
15.04.2011  16:43               683 paperType.py
15.04.2011  16:43             3 202 Picture.py
15.04.2011  16:43             1 520 printSize.py
15.04.2011  16:43               687 PurchaseItem.py
15.04.2011  16:43             1 239 Tools.py
15.04.2011  16:11                 0 __init__.py

【问题讨论】:

    标签: django django-models django-south


    【解决方案1】:

    要公开类,您必须在 __init__.py 中导入它们,例如:

    from Picture import Picture 
    from paperType import paperType 
    ...
    __all__ = ['Picture', 'paperType', ...]
    

    导入的顺序很重要。

    如果你不这样做,你就没有访问路径picviewer.models.Picture,它是picviewer.models.Picture.Picture

    【讨论】:

    • south 现在已经创建了表,但是我在渲染时遇到了数据库错误:没有这样的表:models_menu - 为什么 django 现在正在寻找 models_menu 而不是 picviewer_menu - 我在哪里可以改变它?
    • 检查您的所有中是否有app_label
    【解决方案2】:

    可能缺少 app_label:http://docs.djangoproject.com/en/dev/ref/models/options/#app-label。在syncdb ignores imported models 中也有更多内容,它涵盖了大部分内容。如果有什么请添加更多详细信息以便更新答案。

    更新:http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/ 似乎模型可能没问题。迁移可能是问题所在。

    【讨论】:

    • @abolotnov,是的,这绝对是app_label。只需添加文档中显示的内容即可。
    • 见上面的例子,app_label 在那里并且不会被拾取
    • 根据示例缩进是错误的。是c/p犯规吗? app_label 设置为 cartItem 而不是元类
    • 是的。我的错。我已经把它改成了正确的(在图片上更新了),但是没有运气去南方接受这些变化:(
    • 等一下。您正在尝试迁移,而不是创建新数据库?尝试 c/p 项目并运行 syncdb 它会创建所有表吗?
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2019-11-01
    • 2021-08-22
    • 2020-05-07
    • 2010-12-08
    • 2017-12-10
    相关资源
    最近更新 更多