Django管理过滤器列表与自定义模型管理器额外的方法

时间:2012-02-03 00:29:08

标签: python sql django django-models django-admin

我的Address模型包含两个浮点字段latlng。我编写了一个带有nearby(lat, lng, distance)方法的自定义模型管理器,该方法使用原始SQL仅返回位于特定半径内的Address个es。 (GeoDjango似乎有点矫枉过正)。

示例电话: Address.objects.nearby(53.3, 13.4, 10)(返回QuerySet)

现在我想使用此方法动态过滤Django管理员中的Address个对象(理想情况下,让用户在Google地图上选择一个位置,使用滑块选择最大距离)。我不知道如何实现这一目标。有人能指出我正确的方向吗?

澄清 您不需要为我编写任何JavaScript,我只想知道如何让Django管理员在URL中评估额外的查询参数,以便我可以执行/admin/appname/address/?lat=53&long=13&dist=10之类的查询。然后,我可以自己弄清楚如何将Google地图和所需的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,而不过滤结果。

2 个答案:

答案 0 :(得分:0)

我已将此添加到对象类的ModelAdmin中,该对象类具有address作为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一样过滤。

有更好的解决方案吗?

答案 1 :(得分:-1)

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

请参阅:Custom Filter in Django Admin on Django 1.3 or below中的解决方案。