Какой фильтр лучше и быстрее - PullRequest
1 голос
/ 07 апреля 2020

Я относительно новичок в django и python, поэтому мне бы очень хотелось узнать, какая из этих двух реализаций является лучшим или более быстрым подходом. В настоящее время я использую фильтр, но я подумал об этом, и потому мне действительно нравится понимание списков, я написал тот же код, используя понимание списков. Оба кода делают одно и то же, но я просто хочу узнать от разработчиков с большим опытом, что лучше и почему. Ниже приведены оба кода.

posts = Post.objects.filter(approved=True).order_by('-date_posted')

posts = [post for post in Post.objects.all().order_by('-date_posted') if post.approved]

1 Ответ

0 голосов
/ 07 апреля 2020

A .filter(..) - это , а не , реализованный для выполнения фильтрации на уровне Django / Python: фильтрация выполняется в базе данных с предложением WHERE (или HAVING). Базы данных - это системы, предназначенные для хранения, извлечения и агрегирования больших объемов данных.

Если вы часто сортируете по значению approved, вы добавляете индекс для столбца:

class Post(models.Model):
    approved = models.BooleanField(<b>db_index=True</b>)

В этом случае в базу данных будет добавлена ​​структура индексации, которая сделает фильтрацию более эффективной.

Обычно лучше фильтровать базу данных, поскольку это означает, что базе данных необходимо передавать меньше записей в Python /. Django слой, а кроме того Django должен десериализовать меньше объектов в объекты памяти. Таким образом, даже если фильтрация с использованием списков была бы такой же быстрой, как фильтрация по базе данных, она все равно снизила бы эффективность, потому что Python / Django сначала должен десериализовать больше элементов. Если количество элементов растет, это в конечном итоге приведет к проблемам с памятью, поскольку вы не можете хранить все записи одновременно в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...