【问题标题】:Django not creating db tables for models (neither with syncdb nor South)Django 没有为模型创建数据库表(无论是 syncdb 还是 South)
【发布时间】:2014-02-14 01:43:20
【问题描述】:

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

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

从类别导入类别

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

Python manage.py syncdb

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

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

Python manage.py schemamigration myapp --initial

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

“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'

您知道这里可能出了什么问题以及为什么我无法检测到我的模型吗?

【问题讨论】:

  • 请编辑您的原始帖子并添加您的评论作为其中的一部分,这样不可读
  • 我已将其添加到原帖中,还需要更多信息吗?
  • 请看我的其他评论
  • 请查看我的编辑以获取更新的解决方案。

标签: python django django-south syncdb


【解决方案1】:

运行以下命令

python manage.py makemigrations yourappname

python manage.py migrate

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

【讨论】:

    【解决方案2】:

    您误解了与南方合作的过程。 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

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

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

    编辑

    我误导了你。由于您非常重视南方的事情,我没有意识到问题是您试图将模型用作目录模块而不是普通文件。这是recognized problem in 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 has been fixed 存在更大的问题。哈扎!

    【讨论】:

    • 我正在使用 --initial 因为它是一个新的应用程序,在 db 中没有模型。我尝试“manage.py convert_to_south myapp”只是为了看看发生了什么,它说“这个应用程序没有模型;这个命令适用于已经有模型同步数据库的应用程序。制作一些模型,然后使用 ./manage.py schemamigration myapp --initial 代替。”如前所述,我可以运行 --initial 并按预期执行,除了生成的文件中没有任何内容之外,它没有检测到任何模型。这些是新模型,没有一个在 db 中。
    • 1.你在帖子中描述的方式不是我描述的方式 2.你能分享models.py吗?此外,您认为相关的任何其他信息。我认为我还没有看到整个问题
    • 我现在已根据您的建议从“models”文件夹中的__init__.py 中删除了引用。谢谢你,尽管它并没有改变我所说的没有检测到模型的问题。
    • 没想到它会改变什么,我只是提到了。
    • 酷,我现在在上面的问题描述中添加了其中一个模型的示例。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2015-06-21
    • 2019-12-24
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多