Фильтр Django и исключить влияние на производительность? - PullRequest
1 голос
/ 25 декабря 2011

Я читаю фильтр и исключаю из документации django, но хочу знать, что если я буду использовать следующий код:

Entry.objects.filter(
   ...     headline__startswith='What'
  ... ).exclude(
 ...     pub_date__gte=datetime.now()
 ... ).filter(
 ...     pub_date__gte=datetime(2005, 1, 1)
 ... )

тогда, это приведет к 1 запросу или 4 запросам? Будет ли он сначала запрашивать и получать все объекты, а затем будет фильтровать и исключать после извлечения всех записей из mysql / db, или все это будет сделано на уровне mysql / db. Потому что, если это не будет сделано на уровне БД, это может привести к проблемам с производительностью. вот почему я хочу знать, что будет фильтровать и исключать работу на уровне приложения или на уровне базы данных?

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

Я получил ответ на свой вопрос, а именно: запрос будет выполнен только один раз, как сказано в собственной документации django:

QuerySets ленивы - процесс создания QuerySet не требует никакогоактивность базы данных.Вы можете собирать фильтры вместе весь день, и Django не будет выполнять запрос до тех пор, пока не будет оценен QuerySet, и хотя это выглядит как три обращения к базе данных, на самом деле он попадает в базу данных только один раз, в последней строке (печать q).В общем, результаты QuerySet не извлекаются из базы данных, пока вы не «попросите» их.Когда вы делаете, QuerySet оценивается путем доступа к базе данных.Подробнее о том, когда именно выполняется оценка, см. «Когда оцениваются наборы запросов» .

0 голосов
/ 17 мая 2013

Просто чтобы немного завершить ответ Хафиза, я вставил здесь код его объяснения.(Я немного растерялся, когда вы ссылались на print(q), хотя вы указали ссылку!)

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
...