#python #django
Вопрос:
Я знаю, что типичный способ ограничить запросы в Django-добавить [:10] в конец запроса, но у меня есть функция, которая использует a functools.reduce(lambda
, и я не уверен, как ограничить размер запроса. В нынешнем виде запрос занимает слишком много времени и собирает слишком много данных. Каков наилучший способ ограничить этот запрос и повысить эффективность?
Вот функция:
def get_threads_for_student_mentor(cls, student_id=None, mentor_id=None):
clauses = []
if student_id:
clauses.append(models.Q(student_id=student_id))
if mentor_id:
clauses.append(models.Q(mentor_id=mentor_id))
if len(clauses) == 0:
raise ValueError("student_id and mentor_id cannot both be None")
return cls.objects.filter(functools.reduce(lambda a, b: a amp; b, clauses))
Я попытался изменить оператор return на return cls.objects.filter(functools.reduce(lambda a, b: a amp; b, clauses))[:5].all()
, а также попытался добавить его в функции добавления, как в
clauses.append(models.Q(student_id=student_id)[:5])
но, увы, до сих пор ничего не работает. Что я здесь делаю не так? Я уверен, что это просто глупая ошибка.
Ответ №1:
Способ построения фильтрации не влияет на ограничение количества результатов. Вы можете работать с:
return cls.objects.filter(functools.reduce(lambda a, b: a amp; b, clauses))[:5]
Вы также можете упростить фильтрацию с помощью:
def get_threads_for_student_mentor(cls, student_id=None, mentor_id=None):
clauses = {}
if student_id:
clauses['student_id'] = student_id
if mentor_id:
clauses['mentor_id'] = mentor_id
if not clauses:
raise ValueError('student_id and mentor_id cannot both be None')
return cls.objects.filter(**clauses)[:5]
cls
должна быть ссылка на класс, а не объект этого класса.