2017-10-11 13 views
1

PostgIS에 ogr2ogr을 사용하여 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_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] 그것은 단지 내가 같은 created_atupdated_at으로 모델에 추가 변경을 추가 할 수있는 방법 Meta- Change Meta options on route

의 변화를 감지 이주에 잡힐까요?

내가 잘못 했나요?

+0

일부 기존 코드를 혁신하려고합니까? 보존해야하는 데이터베이스가 있습니까? –

+0

@ JohnMoutafis 음, 그렇습니다. 하지만 실제로 그것을 설정하고 있기 때문에 실제로 모든 것을 다시 할 수 있습니다. 그러나 내 문제는 예를 들어 모델에 다른 필드를 추가해야 할 필요가있는 경우, 어떻게 다시 다시 실행하는 것과 같은 것을 방지 할 수 있습니까? – Reiion

+0

안녕하세요, @Reiion 내 대답이 도움이 되었습니까? 문제를 해결 했습니까? –

답변

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

나는 첫 번째 것을 시도했다. 두 번째도 실행 가능해 보입니다. 그러나 모델에 새로운 필드를 추가하면 항상 그것을 편집해야했습니다. 필드를 삭제하면 반영됩니다. 그래서 그것은 실제로 제 문제입니다. :( – Reiion