Django模型不创建PostgreSQL表

时间:2018-10-05 18:38:06

标签: python django postgresql

我在django项目中的记者应用程序中添加了一个简单的模型

android:process

当我class Municipalities(models.Model): namelsad = models.CharField(max_length=100) geom = gismodels.MultiPolygonField(srid=4326)

它说python3 manage.py makemigrations reporter

然后当我no changes detected in reporter

python3 manage.py migrate reporter

但是没有reporter_municipalities的PostgreSQL数据库表

报告程序包含在已安装的应用程序中

市政模型位于记者应用程序的model.py文件中

我应该添加一个县表,并在PostgreSQL中手动将其删除,然后尝试添加市政模型以创建表

市镇也属于django_content_type

enter image description here

但没有市镇表

更新

Operations to perform: Apply all migrations: reporter Running migrations: No migrations to apply. 更改为Class Municipalities

Class Muni

然后它问我

python3 manage.py makemigrations reporter

如果我单击y

然后运行迁移

给我

Did you rename the reporter.Municipalities model to Muni? [y/N] 

但是我很困惑,那个表没有而且永远不存在!

由于“ reporter_municipalities”,我现在根本无法迁移到数据库

3 个答案:

答案 0 :(得分:1)

当Django寻找迁移时,它会按照您的reporter中的配置搜索应用INSTALLED_APPS。它使用AppConfig或应用程序名称来检索完整的程序包名称,即my_project.reporter。此软件包必须在您的PYTHONPATH中可用。它应该仅在您的开发项目中可用,但是可能会在“ virtualenv”中“安装”它。它可以在运行pip install .(没有-e)或(在某些配置下)运行测试时发生(我已经看到这种情况发生在tox中)。

在这种情况下,您有两个my_project.reporter可用于python,但是您编辑/更新了“第二”个。当您运行./manage.py makemigrations时,python首先会找到您未更改的代码(virtualenv中已安装的代码),因此不会找到更新。

要检查是否有此重复项,您可以:

  1. 卸载项目(pip uninstall <django-project>),以查看它是否指向“符号链接”

    如果是这种情况,您会看到类似 Uninstalling <PROJECT>: Would remove: /data/PROGETTI/UNICEF/odk/.venv/lib/python3.6/site-packages/<PROJECT>.egg-link Proceed (y/n)? y

    请注意行末的egg-link

OR

  1. 打开一个外壳并输入import <full_path_of_reporter> AS pkg; print(pkg.__file__)并检查文件路径

答案 1 :(得分:0)

我迟到了这个问题,但是对于以后遇到此问题的人来说,迁移文件夹中的扩展名为.pyc的 pycache 文件夹中有文件。只需删除这些文件(如果它们已经存在)并从头开始运行即可,即再次从makemigrations开始运行,希望您会得到它。通过删除Migrations文件夹中除 init 之外的文件并删除pycache文件夹中除 init 之外的文件,我以相同的方式进行操作。

答案 2 :(得分:0)

对不起,我无法给出非常技术性的答案,但是我直接通过pgAdmin创建了一个具有相同名称的表,对此我感到很困惑。进行并运行迁移。此时,该表已被识别,但是显然没有正确工作,因为它没有列。然后,我在models.py中注释掉了模型,并进行了迁移,从而删除了表。我在pgAdmin上检查了该表已被删除。然后,我删除了迁移文件(不知道是否有必要),在models.py中取消注释该模型,然后再次进行迁移。之后工作正常。