Какой фильтр выборки последнего элемента предподчтительнее использовать?

Всем привет.

Ситуация: есть 100 форумных тем, в каждой теме есть по 10 комментариев, каждый комментарий имеет своего автора.

Задача: вывести username последнего человека, кто оставил комментарий в отдельной теме.

Есть вопрос по фильтру для вывода последнего юзера из темы.

Два варианта:

last_user = item.forumcom_set.latest('user_link').user_link

last_user = item.forumcom_set.all().order_by('-id')[0].user_link


Какой из них использовать выгоднее с точки зрения производительности и идеологии?
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
winordie
@winordie
Лучшая документация -- исходники
Посмотрим что происходит в первом и втором случае
def latest(self, field_name=None):
    return self._earliest_or_latest(field_name=field_name, direction="-")

def _earliest_or_latest(self, field_name=None, direction="-"):
    ...
    obj = self._clone()
    obj.query.set_limits(high=1)
    obj.query.clear_ordering(force_empty=True)
    obj.query.add_ordering('%s%s' % (direction, order_by))
    return obj.get()


def order_by(self, *field_names):
    ...
    obj = self._clone()
    obj.query.clear_ordering(force_empty=False)
    obj.query.add_ordering(*field_names)
    return obj

def __getitem__(self, k):
    ...
    qs = self._clone()
    qs.query.set_limits(k, k + 1)
    return list(qs)[0]

Т.е. в обоих случаях к query применяются методы set_limits, clear_ordering, add_ordering. Отличаются они лишь агрументом force_empty=False/True и полем по которому ты сортируешь (не понятно зачем ты сортируешь по user_link)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы