在Model中过滤查询范围

时间:2017-01-20 14:52:18

标签: python django django-models django-queryset

我正在尝试使用我的类中的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()以使用范围测试功能?

提前谢谢。

1 个答案:

答案 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而不是属性,这样数据库只会被命中一次。