使用South...需要进行3次迁移才能解决此问题。(链接:如何安装South)
1)添加一个名为point
的PointField
:
from django.contrib.gis.db import models <-- NEW
class Location(models.Model):
lat = models.CharField(blank=True, max_length=100)
lng = models.CharField(blank=True, max_length=100)
point = models.PointField(null=True) <-- NEW
2) 自动执行schemamigration
patrick@localhost:~$ python manage.py schemamigration my_app_name --auto
3)执行自定义的 datamigration
,在现有的 CharField
属性中为每个元素创建一个点。
patrick@localhost:~$ python manage.py datamigration my_app_name latlng_to_point
编辑由datamigration
管理命令创建的文件:
from django.contrib.gis.geos import Point
class Migration(DataMigration):
def forwards(self, orm):
"Write your forwards methods here."
for location in orm['my_app_name.Location'].objects.all():
location.point = Point(float(location.lng), float(location.lat), srid=4326)
location.save()
def backwards(self, orm):
"Write your backwards methods here."
for location in orm['data.Location'].objects.all():
location.point = None
location.save()
4) 从你的模型中删除CharField
并移除null=True
(如果你想要这样做):
class Location(models.Model):
point = models.PointField(null=False) <-- NEW: null=False
5) 自动创建另一个模式迁移
patrick@localhost:~$ python manage.py schemamigration my_app_name --auto
6)成功运行迁移!这时候对数据库等进行了更改。
patrick@localhost:~$ python manage.py migrate my_app_name
django.db.utils.DataError: Geometry SRID (0) does not match column SRID (4326)
的错误。 我通过以下方式解决了这个问题migrations.RunSQL('''UPDATE myapp_location SET point = ST_SetSRID(ST_MakePoint(llng,lat),4326)''')
- jbacker