【问题标题】:Object has no attribute 'distance' - GeoDjango对象没有属性“距离”-GeoDjango
【发布时间】:2017-10-04 17:39:08
【问题描述】:

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

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

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'

【问题讨论】:

    标签: django django-queryset geodjango geopy


    【解决方案1】:

    让它工作

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

    【讨论】:

    • 你从哪里导入Distance
    • @BrettJackson from django.contrib.gis.db.models.functions import Distance
    【解决方案2】:

    正如这一行所写:

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

    因为这里,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)
    

    【讨论】:

    • 我刚刚尝试过,但仍然无法正常工作。在尝试循环并获取每个实例的距离后,我只是在问题中添加了一些额外的上下文。
    • @BrandonMitchell 两种情况的问题是相同的。 Chapter 模型没有名为 distance 的字段/属性。
    • @BrandonMitchell 请在问题中添加模型章节的代码。这将有助于解决问题。
    • @BrandonMitchell 您可以从寻求帮助的问题中注意到,该答案没有提及有关此方法的任何内容。这也是 Op 在那个问题上的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 2015-06-28
    • 2021-12-19
    • 2010-12-28
    • 2015-04-17
    • 2015-02-12
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多