2016-06-19 1 views
0

фильтрования Я использую следующие два взаимозаменяемый проект Django:Эквивалентности Джанго QuerySet

Comments.objects.filter(writer=self.request.user).latest('id')

и

Comments.objects.get(writer=self.request.user)

ли они эквивалентны на практике? docs, похоже, явно не рассматривают это.

+0

Они оба дают одинаковый результат, но получить используется, когда есть только одна запись в базе данных, и где, как фильтр используется для получения QuerySet. Когда мы используем get, если условие терпит неудачу, оно поднимет . ИсключениеDoesNotExist, где в качестве фильтра не будет повышать ошибку, вместо этого возвращается пустой Queryset. – MicroPyramid

ответ

0

Они не эквивалентны, но это сильно зависит от конкретной модели. Мы не знаем подробностей вашей модели Comments, но если предположить, что поле автор не является уникальным:

Для первого оператора:

Comments.objects.filter(writer=self.request.user).latest('id') 

возвратов в сущности, объект с самым большим id среди набора запросов всех комментариев к конкретному писателю. Если вы посмотрите на django.db.connections['default'].queries, увидите, что итоговый запрос представляет собой оператор SELECT .. ORDER_BY .. LIMIT ...

Для второго утверждения:

Comments.objects.get(writer=self.request.user) 

Возвращает конкретную запись ФОТ этого писателя. В случае, если их более одного, вы получаете исключение MultipleObjectsReturned. Если объект не найден, вы получаете исключение DoesNotExist. В случае, если это будет уникальное поле или случайно будет один объект, результирующий запрос будет оператором SELECT .. WHERE, который выполняется быстрее.

В отношении документации, если вы посмотрите на ссылку Options.get_latest_by, есть более подробная информация о назначении функции latest. Подумайте об этом больше о удобстве Django. Тем не менее очень важно понять, как Django оценивает запросы и полученный SQL, и всегда есть много способов достичь одного и того же запроса, так что это вопрос логики.

0

Я не знаю, почему вы думаете, что это эквивалент или почему документы должны адресовать это конкретно.

В случае, когда у вас есть только один соответствующий Комментарий, да, это даст тот же результат. Но первая версия будет делать это с помощью более сложного запроса с добавлением сортировки по id.

Если у вас есть более одного комментария для этого автора - как представляется, - вторая версия всегда будет давать ошибку MultipleObjectsReturned.

0

filter дает все линии, соответствующие вашему фильтру.

latest дает самую последнюю строку (максимальное значение ID)

Например:

Comments.objects.filter(writer=self.request.user).latest('id') получает в первую очередь все Comments написаны self.request.user, а затем latest получить новейший из них.

get сделан, чтобы получить уникальную линию, так:

Comments.objects.get(writer=self.request.user) даст комментарий, написанный self.request.user. Должен быть только один. Если пользователь может написать много комментариев, тогда вы должны использовать filter или, возможно, all. Это зависит от того, что вы хотите точно.

Подробнее here