对象没有属性'distance' - GeoDjango

4

我正在参考下面列出的问题中的答案,因为我正在尝试运行一个查询,在我的Django应用程序中获取最接近给定点的对象。我的Django版本是1.9.2。

如何使用geodjango返回距离给定点最近的记录?

在我的视图中,我传递一个Zipcode并使用GeoPy获取位置和纬度/经度。

from django.contrib.gis.geos import *
from django.contrib.gis.measure import D
from geopy.geocoders import Nominatim

geolocator = Nominatim()

zipcode = self.request.query_params.get('zipcode', None)
distance_m = 20000

if zipcode is not None:
    location = geolocator.geocode(zipcode, timeout=None)
    origin = Point((location.latitude, location.longitude))

    queryset = Chapter.objects.filter(location__distance_lte=(origin, D(m=distance_m))).distance(origin).order_by('distance')[:1][0] 
    return queryset

Chapter模型有一个名为location的字段,它是一个点字段。

from django.contrib.gis.db import models

class Chapter(models.Model):
    name = models.CharField(max_length=500)
    school = models.ForeignKey(School)
    verification = models.CharField(max_length=50)
    address1 = models.TextField()
    address2 = models.TextField(null=True, blank=True)
    city = models.TextField()
    state = models.TextField()
    zipcode = models.CharField(max_length=5)
    location = models.PointField(srid=4326, null=True, blank=True)
    is_school = models.BooleanField(default=False)
    is_association = models.BooleanField(default=False)
    authorized = models.NullBooleanField(default=False)
    stripe_account_active = models.NullBooleanField(default=False)

    def __unicode__(self):
        return self.name

    def get_nickname(self):
        return self.school.nickname

执行时出现以下错误:

AttributeError: 'QuerySet' object has no attribute 'distance'

编辑--

当我尝试使用上述问题中的替代方法获取距离时,我得到了不同的错误,这使我认为我的模型存在问题。

point = Chapter.objects.get(name='Chapter of the Year').location
distance_m = 20000

for chapter in Chapter.objects.distance(point):
    print(chapter.name, chapter.distance)

错误:
'Manager' object has no attribute 'distance'
2个回答

6

已经使其工作

Chapter.objects.filter(location__distance_lte=(origin, D(m=distance_m))).annotate(distance=Distance('location', origin)).order_by('distance')[:1][0] 

5
你从哪里导入了 Distance - Brett Jackson
3
@BrettJackson from django.contrib.gis.db.models.functions import Distance - jmq

2

如此一行所述:

queryset = Chapter.objects.filter(location__distance_lte = (origin, D(m=distance_m))).distance(origin).order_by('distance')[:1][0] 

您正在按照“距离”排序结果,但章节模型中并没有该字段/属性。 我认为您想要按照“位置__距离”排序,因此实际的筛选查询应该是:
queryset = Chapter.objects.filter(location__distance_lte= (origin, D(m=distance_m))).distance(origin).order_by('location__distance')[:1][0] 

此行完全不正确:
for chapter in Chapter.objects.distance(point):

因为在这里,distance 不是像 filterget 这样的方法。 它应该像这样:

point = Chapter.objects.get(name='Chapter of the Year')
distance_m = 20000

for chapter in Chapter.objects.filter(id = point.id ):
    print(chapter.name, chapter.location.distance)

1
我刚刚尝试了一下,还是不起作用。在尝试循环并获取每个实例的距离后,我刚刚为问题添加了一些额外的上下文。 - Brandon Mitchell
@BrandonMitchell 两个条件的问题是相同的。Chapter 模型没有名为 distance 的字段/属性。 - Prakhar Trivedi
@BrandonMitchell 请在问题中添加 Chapter 模型的代码。这将有助于解决问题。 - Prakhar Trivedi
@BrandonMitchell 你可以从寻求帮助的问题中注意到,答案并没有提及这种方法。这也是该问题中原作者的错误。 - Prakhar Trivedi
让我们在聊天中继续这个讨论 - Prakhar Trivedi
仍在努力使查询集返回最接近的位置。 - Brandon Mitchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接