2017-05-06 55 views
2

我指的是下面列出的问题中的答案,因为我试图运行一个查询来获取距我的django应用程序中给定点最近的对象。我的Django版本是1.9.2。对象没有属性“距离” - GeoDjango

How to return a record with the lowest distance from a point using geodjango?

在我看来,我传递一个邮政编码,并使用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 

模型有一个名为位置这是一个点场场。

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' 

Edit--

当尝试使用替代方法中的问题,让以上的距离我得到一个不同的错误让我觉得我的模型有问题。

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' 

回答

1

写在这条线:

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

你被距离排序的结果,但不是在第三章模型场/属性。 我想你想要的东西通过location__distance是顺序,因此实际筛选器查询应该是:

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): 

因为在这里,距离不像过滤器的方法得到。 它应该是这样的:

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) 
+0

我只是想这和它仍然没有工作。在尝试循环并获得每个实例的距离后,我只是在该问题中添加了一些额外的上下文。 –

+0

@BrandonMitchell这两个条件的问题都是一样的。 **第**章模型没有名为** distance **的字段/属性。 –

+0

@BrandonMitchell请在问题中添加模型**章**的代码。这将有助于解决问题。 –

3

得到这个工作

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

从哪里导入'距离'? –