【问题标题】:Django does not want to include models in migration - PostgreSQLDjango 不想在迁移中包含模型 - PostgreSQL
【发布时间】:2017-05-01 03:00:11
【问题描述】:

我有一个非常具体的问题,django-admin.py 没有在应用程序目录中为模型创建表。我创建了一个 PostgreSQL 数据库和用户,然后授予该用户数据库上的所有权限,然后将此数据库包含在 settings.py 中。 settings.py 的相关部分如下所示:

DATABASES = {
    'default': {
    'ENGINE':    'django.db.backends.postgresql_psycopg2',
    'NAME':      'crawler',
    'USER':      'austinpowers',
    'PASSWORD':  '****',
    'HOST':      'localhost',
    'PORT':      ''
    }
}

Django 能够访问这个数据库,因为 manage.py dbshel​​l 运行良好。

现在我希望 Django 根据以下应用程序“爬虫”的 models.py 文件创建表:

from django.db import models


class Files(models.Model):
    id = models.IntegerField(primary_key=True, blank=False, null=False)  
    filename = models.TextField(blank=True, null=True)
    status = models.IntegerField(blank=True, null=True)

    def __unicode__(self):
        return self.filename

    class Meta:
        verbose_name = 'File'
        verbose_name_plural = 'Files'


class IpLog(models.Model):
    id = models.IntegerField(primary_key=True, blank=False, null=False)  
    ip = models.TextField(blank=True, null=True)
    time_changed = models.TextField(blank=True, null=True)

    def __unicode__(self):
        return self.time_changed

    class Meta:
        verbose_name = 'IP Log'
        verbose_name_plural = 'IP Logs'


class Jobs(models.Model):
    id = models.IntegerField(primary_key=True, blank=False, null=False)  
    run_no = models.IntegerField(blank=True, null=True)
    shop = models.TextField(blank=True, null=True)
    pzn = models.TextField(blank=True, null=True)
    status = models.IntegerField(blank=True, null=True)

    def __unicode__(self):
        return self.shop + ": " + self.pzn

    class Meta:
    verbose_name_plural = 'Jobs'
    verbose_name = 'Job'

所以我确保“爬虫”应用子目录中的“迁移”文件夹为空,数据库为空,然后调用:

python manage.py makemigrations

.. 导致以下输出的原因:

No changes detected

所以我想通过运行来强制 Django 为应用程序“爬虫”创建初始迁移:

python manage.py makemigrations crawler --empty

...输出什么:

Migrations for 'crawler':
  crawler/migrations/0001_initial.py:

但是,当我想查看迁移文件 /crawler/migrations/0001_initial.py 的内容时,我得到一个空的迁移文件:

# -*- coding: utf-8 -*-
# Generated by Django 1.10.4 on 2016-12-15 13:25
from __future__ import unicode_literals

    from django.db import migrations


    class Migration(migrations.Migration):

        dependencies = [
        ]

        operations = [
        ]

这表明 Django 出于某种原因不希望在 models.py 中为模型创建相应的表。

确实,当我打电话时...

python manage.py migrate

...我得到以下输出:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, crawler, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying crawler.0001_initial... OK

并且我的模型的表不存在于数据库中。

你知道,我怎样才能强制 Django 创建表? 使用的 Django 版本是 1.10.4

提前感谢您的帮助。

【问题讨论】:

  • 您的crawler 应用在INSTALLED_APPS 列表中吗?
  • 在@chris 指出的基础上,使用命令python manage.py migrate 将迁移更改应用到db。
  • @VikashSingh:OP 不是已经这样做了吗?
  • @Chris 是的。
  • @VikashSingh 正如我在上面写的,我称之为命令。

标签: python django postgresql python-2.7 django-models


【解决方案1】:

您正在混淆数据迁移和架构迁移。 --empty 标志用于数据迁移,专门用于创建空迁移文件,以便您可以使用自定义迁移命令来生成数据迁移。

在您的情况下,您没有数据。所以正确的命令是

 python manage.py makemigrations crawler 

紧随其后

 python manage.py migrate

更新: 请注意,第一次在新创建的应用程序上运行迁移时,您需要明确提及应用程序名称。 仅仅做 ./manage.py makemigrations 通常是行不通的。这是您第一次在没有应用名称的情况下运行它时发生的情况。

【讨论】:

  • 正如 OP 所说:python manage.py makemigrations 导致 No changes detected?
  • @AKS,OPs 命令是python manage.py makemigrations --empty
  • 是这样吗?请从顶部再次检查;-)
  • @e4c5 是的,更新已经足够好了 :)。虽然我想知道为什么它通常不适用于新应用?
  • @AKS,那部分我也搞不明白!! :-)
猜你喜欢
  • 2019-07-12
  • 2019-09-09
  • 2020-09-10
  • 2021-07-19
  • 1970-01-01
  • 2021-11-29
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多