【问题标题】:GeoDjango: Can't save a model with PointField(), Error: SpatialProxy (POINT) with value of type: <class 'users.models.Point'>GeoDjango:无法使用 PointField() 保存模型,错误:SpatialProxy (POINT) 类型值为:<class 'users.models.Point'>
【发布时间】:2017-09-07 17:45:51
【问题描述】:

这个想法是集成谷歌地图而不是 GeoDjango v1.11.5 PointField() 的默认地图。

目前,在我的 models.py

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher')
    placename = models.CharField(blank=True,max_length=255)
    latitude = models.FloatField(blank=True, null=True, verbose_name='Latitude')
    longitude = models.FloatField(blank=True, null=True, verbose_name='Longitude')
    location = models.PointField(blank = True, null=True, srid=4326)
    objects = models.GeoManager()

    def save(self, *args, **kwargs):
        self.location = Point(self.longitude, self.latitude)
        super(Teacher, self).save(*args, **kwargs)  # Call the "real" save() method.

但是,当我在手动添加经纬度后单击保存时,我得到:

TypeError at /admin/users/location/add/ 无法设置位置 SpatialProxy (POINT) 类型值为:

【问题讨论】:

  • 你得到的完整的 TypeError 是什么?您在重要部分之前将其切断

标签: django geodjango


【解决方案1】:

我相信您使用了错误的 Point 类。 Point 应该从 django.contrib.gis.geos 而不是 users.models.Point 导入,如果你将它与 PointField 一起使用的话

您的导入应如下所示:

from django.contrib.gis.db import models
from django.contrib.gis.geos import Point

【讨论】:

  • 谢谢,我从 django.contrib.gis.db 导入模型,我实际上有 2 个导入。那和从 django.db 导入模型
  • 我添加了上述内容,但不幸的是它不起作用。如果我没有保存方法,我可以成功保存模型
  • @Roma 你应该只从django.contrib.gis.db 导入模型,而不是两者。您可以编辑答案以包含所有导入吗?
  • 我现在没有同时导入两者,而是 from django.contrib.gis.db import models as gis_models 和 from django.db import models 。现在一切正常
  • 你是说我应该从 django.db 中完全删除导入模型?
【解决方案2】:

从给定代码导入模型

from django.db import models <br>
from django.contrib.gis.db import models

然后编写你的代码

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, 
    related_name='Teacher')
    placename = models.CharField(blank=True,max_length=255)
    latitude = models.FloatField(blank=True, null=True, 
    verbose_name='Latitude')
    longitude = models.FloatField(blank=True, null=True, 
    verbose_name='Longitude')
    location = models.PointField(blank = True, null=True, srid=4326)
    objects = models.GeoManager()

    def save(self, *args, **kwargs):
        self.location = Point(self.longitude, self.latitude)
        super(Teacher, self).save(*args, **kwargs)  # Call the "real" 
        save() method. 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2012-10-01
    • 2020-05-18
    • 2019-06-02
    相关资源
    最近更新 更多