2017-10-11 65 views
1

我成功地使用ogr2​​ogr將我的Geojson數據導入到PostGIS。在Postgres/PostGIS中遷移django模型沒有反映

我運行下面的命令:python manage.py inspectdb

class Route(models.Model): 
    ogc_fid = models.AutoField(primary_key=True) 
    distance = models.FloatField(blank=True, null=True) 
    route_type = models.CharField(max_length=-1, blank=True, null=True) 
    route_long = models.CharField(max_length=-1, blank=True, null=True) 
    route_name = models.CharField(max_length=-1, blank=True, null=True) 
    agency_id = models.ForeignKey(max_length=-1, blank=True, null=True) 
    route_id = models.CharField(max_length=-1, blank=True, null=True) 
    route_url = models.CharField(max_length=-1, blank=True, null=True) 
    route_desc = models.CharField(max_length=500, blank=True, null=True) 
    duration = models.FloatField(blank=True, null=True) 
    shape_id = models.IntegerField(blank=True, null=True) 
    route_tcolor = models.CharField(max_length=-1, blank=True, null=True) 
    route_color = models.CharField(max_length=-1, blank=True, null=True) 
    wkb_geometry = models.LineStringField(blank=True, null=True) 

class Meta: 
    managed = False 
    db_table = 'network_route' 

當然,我不得不修改max_length爲正整數,並設置manageTrue所以我做到了。

我還添加了一列,created_atupdated_at

所得的下列最終模型:

class Route(models.Model): 
    ogc_fid = models.AutoField(primary_key=True) 
    distance = models.FloatField(blank=True, null=True) 
    route_type = models.CharField(max_length=100, blank=True, null=True) 
    route_long = models.CharField(max_length=200, blank=True, null=True) 
    route_name = models.CharField(max_length=100, blank=True, null=True) 
    agency_id = models.ForeignKey(Agency, on_delete=models.CASCADE) 
    route_id = models.CharField(max_length=100, blank=True, null=True) 
    route_url = models.CharField(max_length=300, blank=True, null=True) 
    route_desc = models.CharField(max_length=500, blank=True, null=True) 
    duration = models.FloatField(blank=True, null=True) 
    shape_id = models.IntegerField(blank=True, null=True) 
    route_tcolor = models.CharField(max_length=100, blank=True, null=True) 
    route_color = models.CharField(max_length=100, blank=True, null=True) 
    wkb_geometry = models.LineStringField(blank=True, null=True) 

    created_at = models.DateTimeField(default=timezone.now(),editable=False) 
    updated_at = models.DateTimeField(blank=True, null=True) 

    objects = models.GeoManager() 

class Meta: 
    managed = True 
    db_table = 'network_route' 

def save(self, *args, **kwargs): 
    #On save, update timestamps 
    if not self.id: 
     self.created_at = timezone.now() 
    self.updated_at = timezone.now() 
    return super(Route, self).save(*args, **kwargs) 

def __str__(self): 
    return self.route_id 

我運行:makemigrations [appname],而且只檢測Meta- Change Meta options on route

的變化我如何才能在模型中添加額外的變化,例如created_atupdated_at被遷移抓住了嗎?

我做錯了什麼?

+0

您是否試圖翻新一些遺留代碼?你有一個你必須保存的數據庫嗎? –

+0

@JohnMoutafis很好,是的。但實際上我可以重做一切,因爲我還在設置它。然而,我的問題在於,例如,如果我需要在模型中添加另一個字段,如何防止再次重做它等內容? – Reiion

+0

嗨,@Reiion我想知道,我的回答有幫助嗎?你解決了你的問題嗎? –

回答

0

問題必須發生在您的遺留代碼中的該行:managed = False。有一些選擇,雖然在如何解決你的問題:

  1. 最簡單的(清白)的方式:

    既然你可以重建你的數據庫和你沒有什麼可以」沒有生活,抹去一切,然後結束。

    • 在您的遷移文件夾中清除除__init__.py之外的所有內容。
    • 擦除您的數據庫並重新制作它。
    • ./manage.py makemigrations
    • ./manage.py migrate


    那麼,你會失去一切,但這是「乾淨的石板」方法。

  2. 的(可能)更好的方式:

    打開你上次遷移(與makemigrations命令所做的一個),並手工編寫的其餘部分:

    # -*- coding: utf-8 -*- 
    from __future__ import unicode_literals 
    
    import django.utils.timezone 
    from django.db import migrations, models 
    
    
    class Migration(migrations.Migration): 
        dependencies = [ 
         ('your_app', 'your_previous_migration'), 
        ] 
    
        operations = [ 
         # That takes care of you Meta changes 
         migrations.AlterModelOptions(
          name='route', 
          options={ 
           'managed': True, 
           'table': 'network_route', 
          }, 
         ), 
         # That will add the created_at field 
         migrations.AddField(
          model_name='route', 
          name='created_at', 
          field=models.DateTimeField(
           default=django.utils.timezone.now, 
           editable=False 
          ), 
         ), 
         # That will add the updated_at field 
         migrations.AddField(
          model_name='route', 
          name='updated_at', 
          field=models.DateTimeField(blank=True, null=True), 
        ] 
    

    現在你可以試着./manage.py migrate與遷移應該做的伎倆!

+0

我嘗試了第一個。第二個看起來可行。但是在模型中添加新的字段,我必須經常編輯它。如果我刪除一個字段,它會反映。所以這實際上是我的問題。 :( – Reiion