2014-12-13 61 views
0

我正在努力处理复杂的Django查询,主要是因为我试图做一些可能很复杂的事情。geodjango foreignkey的距离

基本上,我得到这个:

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
  • 查询