Django没有为模型创建数据库表(既不使用syncdb也不使用南部)

use*_*889 4 python django syncdb django-south

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

我创建了一些模型并调试它们,以便它们验证并且不会出错.我将它们放在myapp的"models"文件夹中,并将每个模型添加到此目录中的init文件中,例如:

来自类别进口类别

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

Python manage.py syncdb
Run Code Online (Sandbox Code Playgroud)

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

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

Python manage.py schemamigration myapp --initial
Run Code Online (Sandbox Code Playgroud)

它正确生成了文件,但没有任何内容(我的模型没有一个表).

"models"文件夹中的示例文件(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'
Run Code Online (Sandbox Code Playgroud)

任何想法在这里可能会出错,为什么我无法检测到我的模型?

Raf*_*fiq 10

运行以下命令

python manage.py makemigrations yourappname

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

注意它适用于我的django 1.7版本.


yuv*_*uvi 8

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

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

    python manage.py schemamigration myapp --initial
    
    Run Code Online (Sandbox Code Playgroud)
  5. 迁移:

    python manage.py migrate
    
    Run Code Online (Sandbox Code Playgroud)

如果要转换项目:

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

    manage.py convert_to_south myapp

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

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

编辑

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

说这是你的结构:

project/
       myapp/
            models/
                  __init__.py
                  bar.py
Run Code Online (Sandbox Code Playgroud)

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

from django.db import models

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

    class Meta:
        app_label = 'myapp' #you need this!
Run Code Online (Sandbox Code Playgroud)

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

from bar import Foo
Run Code Online (Sandbox Code Playgroud)

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

更新2014年8月18日

票证已更改为wontfix,因为显然app_label的更大问题已修复.Huzza!