Django передать предикат для фильтрации функции
У меня есть следующий код, так как вы можете видеть только то, что изменяется, это вызов функции 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 ответ
Решение
Так как 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)))