'ForeignKey' 对象没有属性

Cod*_*ain 2 python migration django

当我尝试为以下模型进行迁移时:

class Location(models.Model):
    name = models.CharField(max_length=200)
    latitude = models.FloatField
    longitude = models.FloatField
    altitude = models.IntegerField

    def _str_(self):
        return self.name

    def getLatitude(self):
        return self.latitude

    def getLongitude(self):
        return self.longitude

class Distance(models.Model):
    placeA = models.ForeignKey(Location, on_delete=models.CASCADE)
    placeB = models.ForeignKey(Location, on_delete=models.CASCADE)
    placeAlatitude = placeA.getLatitude()
    placeBlatitude = placeB.getLatitude()
    placeAlongitude = Location.objects.select_related().get(placeA.longitude)
    placeBlongitude = Location.objects.select_related().get(placeB.longitude)
    distance = models.FloatField(default = 0.0)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

'ForeignKey' 对象没有属性 'getLatitude'

如果我尝试直接访问纬度,我会收到类似的错误 ( placeA.latitude)

我究竟做错了什么?我是使用 Django 框架的新手。

Wil*_*sem 5

首先,有可能在一个错误Location的模型:你在这里不会兴建FloatFieldS和IntegerField:你只传递给类的引用,你不“来电”了。因此,为了定义这些列,您应该添加括号:

class Location(models.Model):
    name = models.CharField(max_length=200)
    latitude = models.FloatField()
    longitude = models.FloatField()
    altitude = models.IntegerField()

    # ...
Run Code Online (Sandbox Code Playgroud)

接下来,您不能定义placeAlatitude等方面与placeA.GetLatitude()在一流水平placeA是一个ForeignKey对象,不是一个Location,对象,但是,您可以定义@property这里的意志,对于一个Distance对象,获取相关对象的正确的属性:

class Distance(models.Model):
    placeA = models.ForeignKey(Location, on_delete=models.CASCADE)
    placeB = models.ForeignKey(Location, on_delete=models.CASCADE)
    distance = models.FloatField(default = 0.0)

    @property
    def placeAlatitude(self):
        return self.placeA.latitude

    @property
    def placeBlatitude(self):
        return self.placeB.latitude

    @property
    def placeAlongitude(self):
        return self.placeA.longitude

    @property
    def placeBlongitude(self):
        return self.placeB.longitude
Run Code Online (Sandbox Code Playgroud)