【发布时间】: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 dbshell 运行良好。
现在我希望 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