我有以下代码,因为您只能看到更改的是函数调用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))
虽然,我在这里只显示了一个过滤器,但实际上我已经链接了查询附加的过滤器和预取条件,如果我不得不重复代码,这会使它变得难看。
答案 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)))