2017-10-11 17 views
1

ogr2ogrをPostGISに使用してGeojsonデータを正常にインポートしました。 python manage.py inspectdbもちろんPostgres/PostGISでのdjangoモデルの移行が反映されない

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を変更する必要がありましたので、私がしたTruemanageを設定します。

は、私は、次のコマンドを実行します。

さらに、追加のカラム、created_atおよびupdated_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]とそれだけで私は、このようなcreated_atupdated_atとしてモデルに追加の変更を加えることができますどのようにMeta- Change Meta options on route

の変化を検出し、マイグレーションによって捕らえられる?

何か間違っていますか?

+0

レガシーコードを改装しようとしていますか?保存しなければならないデータベースがありますか? –

+0

@JohnMoutafisまあ、はい。私はまだそれを設定しているので、実際に私はそれをすべてやり直すことができます。しかし、私の問題は、例えば、私のモデルに別のフィールドを追加する必要がある場合、どうやってそれをやり直すかなど、どうすればいいのでしょうか? – Reiion

+0

ちょっと、私は答えてくれましたか?あなたはあなたの問題を解決しましたか? –

答えて

0

問題は、従来のコードでその行から発生しているはずです:managed = False。しかし、あなたの問題を解決する方法についていくつかのオプションがあります。

  1. 簡単(白紙)方法:

    あなたのデータベースを再構築することができますし、何を持っていないので、そのことができます」 tなしで生きて、すべてを消してそれをやりなさい。

    • マイグレーションフォルダ内の__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

私は最初のものを試しました。 2番目のものも実行可能に見えます。しかし、モデルに新しいフィールドを追加するには、私は常にそれを編集しなければなりませんでした。フィールドを削除すると反映されます。それは実際に私の問題です。 :( – Reiion

関連する問題