2013-08-12 4 views
2

내가 나에게 거리 (그래서 가장 가까운 첫 번째)에 의해 주문 (20)에 가장 가까운 사용자를 제공하는 데이터베이스 쿼리를 만들려고 노력하고 예상대로 작동하지 않는 때라도order_by ('- 거리') 내가 뭐하는 거지

distance_mi = 100 

origin = GEOSGeometry('SRID=4326;'+ 'POINT('+ str(user_profile.current_location.x)+' '+str(user_profile.current_location.y)+')') 

close_users = UserProfile.objects.exclude(user = user).filter(current_location__distance_lte=(origin, D(mi=distance_mi))).distance(origin).order_by('-distance')[:20] 

하지만, 이것은 3 명의 사용자 (올바른)를 반환하지만 첫 번째 사용자는 0 마일 떨어져 있고, 두 번째 사용자는 8 마일 떨어져 있으며 세 번째 사용자는 0 마일 떨어져 있습니다. 마지막 사용자가 8 마일 사용자 인 것을 제외하고입니다.

내가 뭘 잘못하고 있는지 잘 모르겠다.

또한, UserProfileUserProfile 하나 이상의 지리적 필드가 포함 된 이후 다음과 같은 모델

class UserProfile(models.Model): 
    # This field is required. 
    user = models.OneToOneField(User) 
    # Other fields here 
    current_location = models.PointField(null = True) 
    seller_current_location = models.PointField(null = True) 
    objects = models.GeoManager() 
    def __unicode__(self): 
     return u'%s' % (self.user.get_full_name()) 
+1

'UserProfile'은'current_location' 이외의 지리학 적 필드를 포함합니까? 그렇다면'distance()'가 예상 한 것과 다른 필드를 사용하고있을 수 있습니다. 'field_name' 인자에 대해'distance()'에 대한 [docs] (https://docs.djangoproject.com/en/dev/ref/contrib/gis/geoquerysets/#geoqueryset-methods)를보십시오. –

+0

또한, "가장 가까운 것"을 원한다면 "거리"를 주문해야합니다. (비록 당신이보고하는 정렬되지 않은 결과를 설명하지는 않지만). –

+0

@KevinHenry 네, 업데이트에 두 개의 PointFields pleace가 있습니다. 둘 다에 대해 field_names를 지정해야합니까? – Jonathan

답변

2

을 가지고, 당신은 당신이 distance()field_name 인수를 원하는 하나를 지정해야합니다.

UserProfile.objects.exclude(user=user).filter(current_location__distance_lte=(origin, D(mi=distance_mi))).distance(origin, field_name='current_location').order_by('distance')[:20] 

자세한 내용은 documentation을 참조하십시오.