2016-12-15 38 views
1

我有一個相當特殊的問題,django-admin.py不在應用程序目錄中爲模型創建表。我創建了一個PostgreSQL數據庫和用戶,然後授予此用戶數據庫的所有權限,然後將此數據庫包含在settings.py中。 settings.py的相關部分如下所示:Django不希望在遷移中包含模型 - PostgreSQL

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

由於manage.py dbshel​​l運行良好,Django能夠訪問此數據庫。

現在我想的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' 

所以我要確保「遷移」文件夾中的「爬蟲」 app子目錄是空的,數據庫是空的,然後調用:

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不希望因爲某些原因,建立相應的表在莫模型dels.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

在此先感謝您的幫助。

+0

您的'crawler'應用程序是否在'INSTALLED_APPS'列表中? – Chris

+0

除@chris指出的外,使用命令'python manage.py migrate'將遷移更改應用到db。 –

+0

@VikashSingh:OP是不是已經這樣做了? – AKS

回答

3

您在混合數據遷移和模式遷移。 --empty標誌用於數據遷移,專門用於創建空遷移文件,以便您可以將自定義遷移命令生成數據遷移。

在你的情況下,你沒有數據。所以,正確的命令是

python manage.py makemigrations crawler 

通過

python manage.py migrate 

更新如下: 請注意,您在上一個新創建的應用程序遷移的第一次,你需要明確提及該應用程序的名稱。 僅僅做./manage.py makemigrations通常不起作用。這是第一次運行時沒有應用程序名稱時發生的情況。

+0

正如OP所說:'python manage.py makemigrations'導致'沒有檢測到變化'? – AKS

+1

@AKS,OPs命令是'python manage.py makemigrations --empty' – e4c5

+0

是這樣嗎?請再次從頂部檢查;-) – AKS