Python Django管理员筛选器列表,带有自定义模型管理器附加方法

Python Django管理员筛选器列表,带有自定义模型管理器附加方法,python,sql,django,django-models,django-admin,Python,Sql,Django,Django Models,Django Admin,我有一个地址模型,它包含两个浮动字段,lat和lng。我编写了一个自定义模型管理器,它使用邻近(lat、lng、distance)方法,使用原始SQL只返回位于某个半径内的地址。(詹戈似乎有点过分了) 示例调用: 地址.对象.附近(53.3,13.4,10)(返回QuerySet) 现在,我想使用此方法动态过滤Django admin中的Address对象(理想情况下,让用户在谷歌地图上选择一个位置,并使用滑块选择最大距离)。我不知道如何做到这一点。谁能给我指出正确的方向吗 澄清 您不需要为我编

我有一个
地址
模型,它包含两个浮动字段,
lat
lng
。我编写了一个自定义模型管理器,它使用
邻近(lat、lng、distance)
方法,使用原始SQL只返回位于某个半径内的
地址。(詹戈似乎有点过分了)

示例调用:
地址.对象.附近(53.3,13.4,10)
(返回QuerySet)

现在,我想使用此方法动态过滤Django admin中的
Address
对象(理想情况下,让用户在谷歌地图上选择一个位置,并使用滑块选择最大距离)。我不知道如何做到这一点。谁能给我指出正确的方向吗

澄清 您不需要为我编写任何JavaScript,我只想知道如何让Django admin计算URL中的额外查询参数,这样我就可以执行诸如
/admin/appname/address/?lat=53&long=13&dist=10
之类的查询。然后,我可能会想出如何将谷歌地图和所需的JavaScript魔法填充到模板中

更新 我试图在ModelAdmin中覆盖
queryset
,如下所示:

def queryset(self, request):
    try:
        lat = float(request.REQUEST['lat'])
        lng = float(request.REQUEST['lng'])
        dist  = int(request.REQUEST['dist'])
        matches = Address.objects.nearby(lat=lat, lng=lng, dist=dist)
        return matches
    except:
        return super(ReportAdmin, self).queryset(request)

但是,管理员不喜欢它,返回时带有
?e=1
,而不过滤结果。

如果您需要管理员列表显示页面上的此功能,您可以编写自定义过滤器


请参阅中的解决方案:。

我已将其添加到对象类的ModelAdmin中,该对象类的地址为FK:

def lookup_allowed(self, lookup, *args, **kwargs):
    if lookup == 'address__dst':
        return True
    return super(ReportAdmin, self).lookup_allowed(lookup, args, **kwargs)
我已将此添加到模型中

def _filter_or_exclude(self, negate, *args, **kwargs):
    try:
        value = kwargs.pop('address__dst')
        matches = self.nearby(*map(float, value.split(',')))
        pks = [m.pk for m in matches]
        kwargs.update({ 'pk__in': pks })
    except:
        pass
    return super(ReportQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
允许我像
?address_dst=lat,lng,dst那样过滤


有更好的解决方案吗?

据我所知,这只允许您对现有的
查找字段进行筛选。在本例中,他们使用
fieldname\u gte
fieldname\u lte
。db manager extra方法没有为latlong+distance提供新的查找字段。