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)))
Другие вопросы по тегам