2016-08-11 5 views
1

私は、クラスの "生きている"インスタンスのリストを決定する操作を頻繁に行っています。インスタンスがライブかどうかを判断するには、現在のクラスのis_liveメソッドに対してテストしています - 下記を参照してください。自己のないインスタンスのリストを返すメソッド

class Game(models.Model): 

    def is_live(self): 
     now = timezone.now() 
     now.astimezone(timezone.utc).replace(tzinfo=None) 
     if self.time is not None and now < self.time: 
      return True 
     if self.time is None: 
      return True 
     else: 
      return False 

は、代わりに私のすべてのビューで、このループを実行するので、私はそれがすべてのライブインスタンスのリストを返し実行するための別の方法を作成するのが大好きです。しかし、そうするために、私は自己の使用を必要とせず、私がそうしようとするたびにエラーが発生しています。どのようにこれを完了するための任意のアイデア。ループは、その後、私はちょうどGame.live_game_list()を呼び出し、すべてのゲームのリストを取得することができるだろう

def live_game_list(): 
    live_game_list = [] 
    for game in Game.objects.all(): 
      if game.is_live == True: 
       live_game_list.append(game) 
    return live_game_list 

以下のようなものになるだろう。

答えて

0

@staticmethodデコレータを使用して、クラスメソッドを静的として宣言します。その後、関数にselfを渡す必要はありません。関数内で直接Gameを使用するのではなく、ゲームオブジェクトを関数のパラメータとして渡すのはなぜですか?私はappendを使用するより効率的な結果を生成するために条件付きリストの理解度を使用しました。

@staticmethod 
def live_game_list(game_objects): 
    return [game for game in game_objects.all() if game.is_live] 
+0

game_objectsをどのように設定しますか?ちょうどGame.objects.all()? –

+0

ゲームを保持する必要があるコンテナに設定できます。以下の@Karinによって記述された方法は、そのような解決策の1つです(彼女がなぜ落とされたのか不明)。 '.all()'メソッドは元のコードと一貫していましたが、なぜそれが必要なのかわかりません。コンテナがゲームオブジェクトのリストであれば、 '' game_objects if game.is_live ''を使って単純に反復することができます。 – Alexander

0

これを実行するためには、個々のインスタンス自身の外にすべてGameのインスタンスを追跡する必要があります。あなたは、これのどこを行うことができますが、1つのオプションは、クラスレベルのリストを持つことです。

class Game(models.Model): 
    all_game_instances = [] 

    def __init__(self, *args, **kwargs): 
     super(Game, self).__init__(*args, **kwargs) 
     self.all_game_instances.append(self) # accesses class attribute list 

    @classmethod 
    def live_game_list(cls): 
     return [game for game in cls.all_game_instances if game.is_live()] 

    def is_live(self): 
     ... 

次にあなたがGame.live_game_list()とゲームのリストにアクセスすることができます。