4

我在 Centos VPS 上有一个 Django 项目。

我创建了一些模型并对其进行了调试,以便它们验证并且没有错误。我将它们放在 myapp 的“models”文件夹中,并将每个模型添加到此目录中的 init 文件中,例如:

从类别导入类别

我将应用程序添加到 settings.pyINSTALLED_APPS并运行:

Python manage.py syncdb

它似乎工作正常,并添加了除我的应用程序之外的所有表。

然后我安装了 South 并将其添加到INSTALLED_APPS并再次尝试 syncdb 并运行:

Python manage.py schemamigration myapp --initial

它正确生成了文件,但其中没有任何内容(我的模型中没有任何表)。

“模型”文件夹中的示例文件 (usertype.py)

from django.db import models

class UserType(models.Model):
    usertype_id = models.PositiveIntegerField(primary_key=True)
    description = models.CharField(max_length=100)
    is_admin = models.BooleanField()
    is_moderator = models.BooleanField()

class Meta:
    app_label = 'myapp'

有什么想法可能会出现问题以及为什么我无法检测到我的模型吗?

4

2 回答 2

10

运行以下命令

python manage.py makemigrations yourappname

python manage.py migrate

请注意,它适用于我的 django 1.7 版本。

于 2014-11-29T16:57:25.710 回答
8

你误解了与南方合作的过程。South 不仅仅是另一个应用程序,它还是一个管理工具。您的应用程序需要从一开始就是 South 应用程序或转换为一个。话虽这么说,过程是这样的:

  1. 将 South 添加到 INSTALLED_APPS
  2. 第一次运行syncdb
  3. 将您的应用添加到 INSTALLED_APPS*
  4. 运行南初始化命令:

    python manage.py schemamigration myapp --initial
    
  5. 迁移:

    python manage.py migrate
    

如果要转换项目:

  1. 添加南后运行syncdb
  2. 跑:

    manage.py convert_to_south myapp

从现在开始使用南来管理您的迁移。

*ps - 您可以同时添加 South 和您自己的应用程序,如果您记住将 south 放在您自己的应用程序之前。那是因为 django 按顺序读取 INSTALLED_APPS - 它在所有应用程序上运行 syncdb,但是在安装 south 后它不会安装其余的,而是告诉您使用 south 命令来处理这些

编辑

我误导了你。由于您非常重视南方的事情,我没有意识到问题是您试图将模型用作目录模块而不是普通文件。这是django中公认的问题,解决方法实际上与您最初的想法完全相同:

说这是你的结构:

project/
       myapp/
            models/
                  __init__.py
                  bar.py

你需要bar.py看起来像这样:

from django.db import models

class Foo(models.Model):
    # fields...

    class Meta:
        app_label = 'myapp' #you need this!

并且__init__.py需要看起来像这样:

from bar import Foo

确保它看起来像这样,它会工作。

2014 年 8 月 18 日更新

票已更改为wontfix,因为显然 app_label 的更大问题已得到修复。胡扎!

于 2014-01-23T14:54:00.440 回答