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提供新的查找字段。