迁移 Postgres/PostGIS 中的 Django 模型未反映
Migrating django models in Postgres/PostGIS not reflecting
我使用 ogr2ogr 成功地将我的 Geojson 数据导入到 PostGIS。
我运行以下命令: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
修改为正整数,并将manage
设置为True
,所以我这样做了。
我还添加了一个额外的列,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
I 运行: makemigrations [appname]
它只检测 Meta
- Change Meta options on route
中的变化
如何在模型中添加其他更改,例如 created_at
和 updated_at
被迁移捕获?
我是不是做错了什么?
问题一定是从您遗留代码中的那一行开始的:managed = False
。关于如何解决您的问题,有一些选择:
简单(干净的)方式:
既然你可以重建你的数据库并且你没有任何你离不开的东西,那就擦掉所有的东西然后重新来过。
- 清除迁移文件夹中除
__init__.py
之外的所有内容。
- 删除您的数据库并重新制作它。
./manage.py makemigrations
.
./manage.py migrate
.
嗯,你会失去一切,但这是 "clean slate" 方法。
(可能)更好的方法:
打开你上次的迁移(用 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
进行迁移,应该可以解决问题![=17=]
我使用 ogr2ogr 成功地将我的 Geojson 数据导入到 PostGIS。
我运行以下命令: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
修改为正整数,并将manage
设置为True
,所以我这样做了。
我还添加了一个额外的列,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
I 运行: makemigrations [appname]
它只检测 Meta
- Change Meta options on route
如何在模型中添加其他更改,例如 created_at
和 updated_at
被迁移捕获?
我是不是做错了什么?
问题一定是从您遗留代码中的那一行开始的:managed = False
。关于如何解决您的问题,有一些选择:
简单(干净的)方式:
既然你可以重建你的数据库并且你没有任何你离不开的东西,那就擦掉所有的东西然后重新来过。
- 清除迁移文件夹中除
__init__.py
之外的所有内容。 - 删除您的数据库并重新制作它。
./manage.py makemigrations
../manage.py migrate
.
嗯,你会失去一切,但这是 "clean slate" 方法。- 清除迁移文件夹中除
(可能)更好的方法:
打开你上次的迁移(用
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
进行迁移,应该可以解决问题![=17=]