我正在尝试使用我的类中的range test执行查询(MapArea),但我似乎没有掌握模型中对象的可见性,因为我得到NameError: name 'MapArea' is not defined
我的课程如下:
class MapArea(models.Model):
lat = models.DecimalField(max_digits=15,decimal_places=6)
lon = models.DecimalField(max_digits=15,decimal_places=6)
nearby_streets = MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2])
# Meta
class Meta:
abstract = True
将nearby_streets
设置为MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2])
是导致NameError: name 'MapArea' is not defined
。
似乎应该定义MapArea according to other answers,但我似乎没有正确访问它。如何访问MapArea.objects.filter()
以使用范围测试功能?
提前谢谢。
答案 0 :(得分:2)
您不能拥有具有此类行为的模型字段。所有模型字段都存储在数据库中,但nearby_streets
似乎是您查询的内容,因此它作为方法或属性更好。
你可以做这样的事情
class MapArea(models.Model):
lat = models.DecimalField(max_digits=15,decimal_places=6)
lon = models.DecimalField(max_digits=15,decimal_places=6)
# Meta
class Meta:
abstract = True
@property
nearby_streets = MapArea.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2])
在其余代码中,您可以从任何MapArea实例访问它map_area.nearby_streets
请记住,每次调用属性时都会计算属性,所以如果你调用nearby_streets两次,它会在数据库中命中两次......
您可以使用cached_property而不是属性,这样数据库只会被命中一次。