【问题标题】:'ForeignKey' object has no attribute'ForeignKey' 对象没有属性
【发布时间】:2018-10-30 06:36:12
【问题描述】:

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

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)

我收到错误:

“ForeignKey”对象没有属性“getLatitude”

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

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

【问题讨论】:

  • placeAlatitude = placeA.getLatitude() 这是什么意思!!!
  • @a_k_v distance类存储placeA和placeB之间的距离。为此,我需要获取每个位置的纬度和经度。我正在尝试使用 Location 类中定义的 getLatitude 函数来返回 placeA 的纬度
  • 不相关,但 getLatitudegetLongitude 方法毫无用处 - latitudelongitude 是公共属性,您不需要 getter。
  • @brunodesthuilliers 这仅适用于初始阶段。其他约束将在稍后添加
  • @CoderBrain 你仍然不需要它们。 Python 对计算属性有很强的支持(property 等),因此您可以随时将普通属性转换为计算属性。但是,如果您真的想要显式访问器,那么至少不要将属性公开为类 API 的一部分:将它们重命名为 _latitude_longitude(前导下划线是“受保护”的命名约定)。由于这些是模型字段,您可能还需要将字段 db_column 参数设置为(resp)“纬度”和“经度”以避免架构迁移。

标签: python django migration


【解决方案1】:

首先你的Location 模型中可能有一个错误:你在这里没有构造FloatFields 和IntegerField:你只传递一个类的引用,你不要“调用”它。所以为了定义这些列,你应该添加括号:

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

    # ...

接下来你不能用placeA.GetLatitude()定义placeAlatitude等,在类级别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

【讨论】:

  • 寻找这个问题的解决方案一个月,我通过这个答案解决了,非常感谢。
  • 感谢您的解决方案,但如果我希望将来距离独立,该怎么办?例如,我将更改位置的纬度和高度,我不会影响已保存的距离对象(采用以前的值)
  • @Bhbf:那么你就不用创建ForeignKey,而是让视图填充现有位置的值。
  • 也许我可以引导您解决我的问题,以便在那里进行更多讨论:stackoverflow.com/questions/71485800/…
【解决方案2】:

在您的模型中,您正在定义结构。你不能使用

placeAlatitude = placeA.getLatitude()
placeBlatitude = placeB.getLatitude() 

placeAlatitude 和 placeBlatitude 必须定义模型的类型。你不能简单地返回值。

通过分析您的模型,这两个字段不是必需的,它是冗余值(placeAlongitude 和 placeBlongitude 的情况相同)。您定义了与位置的外键关系。因此,您可以使用该关系访问经度和纬度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2011-07-06
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2012-12-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多