Как ограничить размер ответа в запросе django lamba

#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 должна быть ссылка на класс, а не объект этого класса.