2012-03-14 7 views
0

問題があります。オブジェクトのメソッドを使用してオブジェクトを含むオブジェクトのリストをソート

オブジェクトの「日付」でソートされたさまざまな種類のオブジェクトのリストを生成しようとしています。各オブジェクトには、ソートする日付を返すメソッドgetDateがあります。

オブジェクトrecent_activityオブジェクトは、このソートされたオブジェクトのリストを返す必要があります。

ただし、以下の行#items.append(self)を参照してください。私は(getDate()メソッドを使用して)日付順、異なる種類のオブジェクトの(スライス)のリストを返し、ライン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] 

しかし、この行が含まれていると、コードは断続的に機能します。一部のオブジェクトでは(上のように)動作しますが、一部ではそうではありません(まったく実際には単にNoneを返します)。

sortedを呼び出す前に配列を返すと、すべて正常に機能します。したがって、問題はsortedへの呼び出しに関連しています。

私が間違っていることを聞いて楽しみにしています!

(明らかに、誰かがこの質問の評価を下していますが、私には分かりませんが、それが不明だと思われる場合は、時間を割いて質問を改善してください)。

- 修正されました。解決策は、datetime.datetimeオブジェクトではなく、datetime.dateオブジェクトを返すコールをgetDate()というときどき発生させていました。データベースの移行により、誤ったタイプのオブジェクトでフィールドの一部を手動で設定するためです。例外がないことを見て驚いたビットは、ただ静かに失敗する。

+0

「None」を返すことがある場合は、何が間違っているのかを知るために人々が使用できる重要なコードを含めるのを忘れていると思います。現在のコードがどのように 'None'を返すのか分かりません。 – roam

+0

まだ保存されていないUserProfileオブジェクトの場合、返されますか?また、後援、コメント、更新、プロジェクトがUserProfileオブジェクトのフィールドであると仮定すると、 'for f in self.followed:'、 'for s in self.sponsored:'、等であるべきです。 – Furbeenator

+0

はわかりませんそれは助けますが、あなたは単に "items = sorted(items、key = UserProfile.getDate、reverse = True)"を実行できませんか? – Arthur

答えて

0

pdbを使用して、私は問題の根本に到達することができました。

私のデータベースにいくつかのオブジェクトがdatetime.datetimeオブジェクトを格納すると考えられていたフィールドに格納されているdatetime.dateオブジェクトを持っていた。この2つのタイプのオブジェクトの比較はソート中に失敗しましたが、サイレントに失敗しました。

ソートされたこれらの比較が例外を生成しなかった理由はわかりません。

とにかく、ありがとうございます。

関連する問題