【问题标题】:Method to Return List of Instances Without Self返回没有自身的实例列表的方法
【发布时间】:2016-08-11 03:28:29
【问题描述】:

我经常运行一个操作来确定一个类的“活动”实例列表。要确定一个实例是否处于活动状态,它正在针对我当前类的 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

不必在我的所有视图中运行此循环,我更愿意创建另一个运行方法来返回所有活动实例的列表。但是,这样做我不需要使用 self 并且每次尝试这样做时都会出错。任何想法如何完成这个。循环如下所示

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

然后我就可以调用 Game.live_game_list() 并获取所有游戏的列表。

【问题讨论】:

    标签: python django methods instance


    【解决方案1】:

    使用@staticmethod 装饰器将类方法声明为静态。然后,您无需将 self 传递给该函数。与其在函数内直接使用Game,不如将​​游戏对象作为参数传递给函数。我使用了条件列表推导来生成比使用append 更有效的结果。

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

    【讨论】:

    • 我将 game_objects 设置为什么?只是 Game.objects.all()?
    • 您可以将其设置为您必须保存游戏的任何容器。下面@Karin 描述的方法就是这样一种解决方案(不确定她为什么被否决)。 .all() 方法是为了与您的原始代码保持一致,但我不明白为什么有必要。如果容器是游戏对象列表,那么您可以通过 [game for game in game_objects if game.is_live] 简单地遍历它
    【解决方案2】:

    为此,您需要跟踪各个实例本身之外的所有Game 实例。您可以在任何地方执行此操作,但一种选择是拥有一个类级列表:

    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() 访问游戏列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2011-12-06
      • 1970-01-01
      • 2019-08-20
      相关资源
      最近更新 更多