Как Django реализует `filter`? Это все выбирает и фильтрует? - PullRequest
1 голос
/ 21 апреля 2019

Я хочу вернуться туда, где x = y с Something.objects.get(x=y).

Я читал, что в Django может быть filter вещь, но я опасаюсь, что Django делает что-то глупое под капотом, например, выбирает все из базы данных в памяти, а затем отбирает вещи, которые не делают совпадать с питоном (как это делает рельсы).

Это то, что делает Джанго? Если это так, я просто запустите сырой SQL.

Единственное, что я вижу в Django docs о multiple, это MultipleObjectsReturned, являющееся исключением.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2019

Вы хотите .filter. Он вернет экземпляр QuerySet. Запрос не будет выполнен, пока вы не попытаетесь выполнить итерацию по QuerySet. Это позволяет вам связывать вызовы для построения сложных запросов.

Запрос выполняется в SQL, а не в Python.

Вы можете проверить запрос, который будет выполнен, посмотрев на .query на получившийся QuerySet.

>>> Something.objects.filter(x='y').query
SELECT id, x, etc from something where x='y';

.get предназначен для извлечения одного объекта.

1 голос
/ 21 апреля 2019

(...) но я устала от погоды Django делает что-то глупое, например, выбирает все из базы данных в памяти, а затем отбирает вещи, которые не соответствуют Python (например, способэто делает rails).

Нет , ORM Джанго создаст запрос SQL .Если вы каким-либо образом не исправите менеджер объектов, он, таким образом, сгенерирует запрос, в котором фильтрация выполняется на стороне database .

Если вы хотите все элементы, которые удовлетворяютДля данного условия вы должны использовать .filter(..), поэтому:

SomeModel.objects.filter(x=y)

это вернет QuerySet: коллекцию (возможно, пустую) из SomeModel объектов.

Если вы хотите получить один элемент, вы используете .get(..):

SomeModel.objects.get(x=y)

. Это вернет SomeModel.DoesNotExist, если такой записи не существует, и SomeModel.MultipleObjectsReturned, если найдены две или более записей.для данного условия.

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