Метод класса моделей Django появляется не для сортировки списка объектов, содержащих себя, совет? - PullRequest
0 голосов
/ 10 февраля 2012

В модели Django UserProfile я пытаюсь сделать следующее:

class UserProfile(models.Model):

  ...

  def recent_activity(self):
    followed_users = Followed.objects.filter(user=self.id).order_by("-when")
    ...

    items = [self]
    for f in followed_users:
      items.append(f)

    ...

    sorted(items,key=lambda item: item.getDate)

    return items[:7]

Код должен возвращать "недавнюю активность" пользователя, объединяя множество различных действий, которые он может выполнить, а затем сортируя их по дате.

В каждой модели реализован метод "getDate", который возвращает дату для сортировки.

код:

  1. Получает QuerySet пользователей, за которыми «следил» пользователь (я использую таблицу с именем Followed, чтобы сохранить тот факт, что пользователь x следует за пользователем y).
  2. Создает список, содержащий рассматриваемый объект UserProfile.
  3. Добавить каждый объект Followed в список.
  4. Сортировка списка по дате последнего редактирования.
  5. Вернуть самые последние n предметов (7 в приведенном выше).

Я думал, что это был аккуратный способ его реализации. Но независимо от того, что я делаю, Python, похоже, отказывается правильно сортировать этот список. Кажется, он правильно сортирует каждый тип недавних действий, за исключением UserProfile, который, кажется, остается там, где я изначально поместил его в этот список после вызова sorted. Это ни в коем случае не дает сбой, просто не возвращает правильно отсортированный список!

Я, вероятно, пропустил что-то простое ... но я бы ожидал, что либо Python пожалуется на то, что метод объекта не может отсортировать список, содержащий сам объект, либо ИЛИ для правильной сортировки списка. Я был немного удивлен, что это не так.

Может кто-нибудь сказать мне, где я сбился с пути?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Проблема в том, что sorted не не сортирует на месте.

Вы, вероятно, читали, что list.sort() делает сортировку на месте. Но sorted() на самом деле возвращает отсортированный список - но вы никому его не назначаете, поэтому он просто отбрасывается. Либо используйте sort(), либо присвойте результат чему-либо.

(Плюс, вам действительно нужно позвонить getDate, как указывает Марчин.)

1 голос
/ 10 февраля 2012

(1) Проблема в том, что item.getDate вернет функцию (точнее, связанный метод) объект getDate, а не дату.Измените его на item.getDate() или используйте key=Followed.getDate, если self является экземпляром Followed.

(2) Нет необходимости использовать цикл для преобразования набора запросов в список.Просто используйте:

items = [self] + list(followed_users)

(Это создает ненужный список. Поскольку вы можете превратить любую итерацию в список, если вы хотите избежать этого, вы можете использовать itertools.chain, чтобы создать одну итерацию для поворотав список).

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