django 将谓词传递给过滤函数

django pass a predicate to filter funtion

我有以下代码,您可以看到唯一改变的是函数调用 point__distance_gte 或 point__distance_lte。有没有办法从调用代码中外部化这个函数。

def search():
    if distance == 50:
        jobs = list(Job.objects.filter(point__distance_gte=(ref_pnt, D(**distance_from_point))))
    else:                   
        jobs = list(Job.objects.filter(point__distance_lte=(ref_pnt, D(**distance_from_point)))

所以像这样:

def search(predicate):
    jobs = list(Job.objects.filter(predicate))

虽然我在这里只展示了一个过滤器,但实际上我有链接的过滤器和附加到查询的预取条件,如果我必须重复代码,这会使它变得丑陋。

因为objects.filter其实是一个函数,你可以像普通函数一样传递kwargs。因此,在您的示例中,您可以执行以下操作:

def search(**kwargs):
    jobs = list(Job.objects.filter(**kwargs))

search(point__distance_gte=(ref_pnt, D(**distance_from_point)))
search(point__distance_lte=(ref_pnt, D(**distance_from_point)))