TypeError: NoneType object is not callable on GeoDjango

TypeError: NoneType object is not callable on GeoDjango

虽然我已经阅读了很多关于PointField'NoneType' object error的类似文章,但我无法弄清楚这个字段应该如何根据我从用户那里收到的经纬度变量自动保存.

这是我的模型:

    from django.db import models
    from django.contrib.gis.db import models
    from django.contrib.gis.geos import Point
    
    class Firm(models.Model):
        FirmName = models.CharField(max_length=50)
        address = models.CharField(max_length=1000, null=True, blank=True)
        FirmAddress = models.PointField(null=True, blank = True, geography=True, default=Point(0.0, 0.0))
        lat = models.FloatField(null=True, blank=True)
        lng = models.FloatField(null=True, blank=True)
        Logo = models.ImageField(null=True, blank=True)
    
        @property
        def save(self, *args, **kwargs):
            self.FirmAddress = Point(self.lng, self.lat)
            super(Firm, self).save(*args, **kwargs)

在 Django shell 上,我输入 from firm.models import Firm先命令后 Firm.objects.create(FirmName="QWERTY", address="temp", lat=24, lng=54, Logo='logo.jpg') 命令。
这是我最后得到的错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\Deniz\Desktop\PROJECT\fenv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Deniz\Desktop\PROJECT\fenv\lib\site-packages\django\db\models\query.py", line 453, in create
    obj.save(force_insert=True, using=self.db)
TypeError: 'NoneType' object is not callable

但是当我查看我的数据库时,我看到 FirmAddress 列中添加了一个 geography-point 类型的值。当我删除 FirmAddress 功能并更新模型时,我没有收到任何错误并且一切正常。

我无法理解的部分是,如果可以将 FirmAddress 数据正确添加到数据库中,为什么我会收到 'NoneType' object 错误?我该如何解决这种情况?非常感谢。

Why am I getting the 'NoneType' object error?

因为您将 save 定义为 @property。结果,如果你使用 self.save,它会调用 save 方法,而 self.save 会将对象 返回的 作为值,但那是 None,因此错误。

因此您应该删除 @property 装饰器:

class Firm(models.Model):
    # …
    
    # <i>no</i> property
    def save(self, *args, **kwargs):
        self.FirmAddress = Point(self.lng, self.lat)
        return super().save(*args, **kwargs)