Использование метода объекта для сортировки списка объектов, который содержит объект - PullRequest
0 голосов
/ 14 марта 2012

У меня проблема.

Я пытаюсь сгенерировать список объектов разных типов, отсортированных по «дате» объекта.У каждого объекта есть метод getDate, который возвращает дату для сортировки.

Объект UserProfile содержит метод recent_activity, который должен возвращать этот отсортированный список объектов.

Тем не менее, см. Строку #items.append(self) ниже?

class UserProfile(models.Model):

    ...

    def getDate(self):
        return self.last_edited

    ...

    def recent_activity(self):

        followed = ...
        sponsored = ...
        ...

        items = []
        #items.append(self) #<-- If this is in, the call to sorted doesn't work

        for f in followed:
            if (...):
                items.append(f)
        for s in sponsored:
            if (...):
                items.append(s)
        for c in comments:
            if (...):
                items.append(c)
        for u in updates:
            if (...):
                items.append(u)
        for p in projects:
            items.append(p)

        #return items[0:7] #<-- If this is in, everything is fine!

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

        return items[0:7]

Когда я закомментирую строку items.append(self), написанный код работает отлично, возвращая (нарезанный) список объектов различных типов, отсортированных по дате (используя метод getDate()).

Однако, когда эта строка включена, код работает с перебоями - и я имею в виду, что для некоторых объектов он работает (как указано выше), а для некоторых - нет (вообще - фактически он часто просто возвращает None).

Если я верну массив ДО вызова sorted, снова все будет работать нормально.Так что проблема связана с звонком на sorted.

Будем рады услышать, что я делаю неправильно!

(Просто чтобы быть ясно, кто-то занизил этот вопрос, я понятия не имею, почему - если вы считаете, что это неясно, пожалуйста,найдите время, чтобы прокомментировать, чтобы я мог улучшить вопрос!).

Редактировать - Исправлено.Решением были случайные getDate() вызовы, возвращающие datetime.date объекты, а не datetime.datetime объекты из-за миграции базы данных, что заставляло меня вручную заполнять некоторые поля неправильным типом объекта.Немного удивлен, что не появляется никаких исключений, просто молчание не сработало.

1 Ответ

0 голосов
/ 15 марта 2012

С помощью pdb мне удалось добраться до корня проблемы.

У пары объектов в моей базе данных было datetime.date объектов, хранящихся в поле, которое должно было хранить datetime.datetime объектов. Сравнения между этими двумя типами объектов не выполнялись во время сортировки, но не выполнялись молча.

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

В любом случае, спасибо за ваши предложения.

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