2014-12-13 2 views
0

Я борюсь со сложными вопросами Django, главным образом потому, что я пытаюсь сделать что-то, что может быть сложным.geodjango foreignkey by distance

В принципе, я получил это:

models.py:

from django.contrib.gis.db import models 

class Show(models.Model): 
    name = models.CharField() 

class Venue(models.Models): 
    name = models.CharField() 
    coords = models.PointField() 
    objects = models.GeoManager() 

class Representation(models.Model): 
    datetime = models.DateTimeField() 
    venue = models.ForeignKey(Venue) 
    show = models.ForeignKey(Show) 

Теперь, что я хочу сделать, это, получить 5 входящих шоу, которые близки к пользователю (user.geoloc является точка). Одна из сложнейших вещей заключается в том, что некоторые из моих пользователей могут жить в области, где нет места, и мое решение просто, если поблизости недостаточно шоу, чтобы искать в большей области.

view.py:

from django.contrib.gis.measure import D 

DISTANCE_CLOSE = 1000 #arbitrary number 

## this thing is not working, because it's not how it should be done 
## but the logic is clearer in this 
def get_nearest_shows_not_working(request): 
    list_shows = {} 
    while len(list_shows<5) 
    list_shows = Show.representation_set.filter(venue__coords__distance_lte=(user.geoloc, D(m=DISTANCE_CLOSE))).order_by('datetime'):[5] 
    DISTANCE_CLOSE = int(DISTANCE_CLOSE*1.2) 
    return render(request, 'template.html', locals()) 

def get_nearest_shows_ducktape(request): 
    list_shows = set() 
    while len(list_show) < 5: 
    list_rep = Representation.objects.filter(venue__coords__distance_lte=(user.geoloc, D(m=DISTANCE_CLOSE))).order_by('datetime') 
    for rep in list_rep: 
     list_shows.add(rep.show) 
    DISTANCE_CLOSE = int(DISTANCE_CLOSE*1.2) 
    list_shows = list_shows[:5] 
    return render(request, 'template.html', locals()) 

Что мне не хватает? в Python, есть один и единственный правильный способ сделать что-то, и здесь я просто возился со сложными вещами, для меня это выглядит неприлично.

ответ

1

Вам нужно будет что-то вроде этого:

Show.representation_set.distance(user.geoloc, field_name='venue__coords') \ 
         .order_by('distance') 

К сожалению, обратное один к одному или один ко многим отношений не поддерживаются методы GeoQuerySet (включая расстояние). Я уже создал a feature request ticket для этого.

Так теперь я думаю, что вы застряли с:

  • некоторые халтуры в Python, не всегда эффективны (как вы написали)
  • с использованием сырой SQL запросов
Смежные вопросы