django传递一个谓词来过滤函数

时间:2015-03-06 23:07:04

标签: django django-queryset django-1.7

我有以下代码,因为您只能看到更改的是函数调用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))

虽然,我在这里只显示了一个过滤器,但实际上我已经链接了查询附加的过滤器和预取条件,如果我不得不重复代码,这会使它变得难看。

1 个答案:

答案 0 :(得分:1)

因为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)))