Skip to main content
 首页 » 编程设计

python之具有自定义模型管理器额外方法的 Django 管理过滤器列表

2025年05月04日34bonelee

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

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

现在我想使用此方法动态过滤 Django 管理中的 Address 对象(理想情况下让用户在 Google map 上选择一个位置并使用 slider 选择最大距离)。我不知道如何实现。谁能指出我正确的方向?

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

请您参考如下方法:

我已经将它添加到具有 address 作为 FK 的对象类的 ModelAdmin 中:

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 那样进行过滤。

有更好的解决方案吗?