根据某些逻辑更新对象数据的最佳方法是什么?

时间:2016-05-03 16:35:48

标签: python mysql django database

我正在创建一个应用程序,其中“Episode”对象具有'air_time'和'air_status'字段。

class Episode(models.Model):
    air_time = models.DateTimeField()
    air_status = models.TextField(default="UPCOMING")
    # air_status can contain UPCOMING, LIVE or VOD in the original code

我想根据'air_time'字段更新'air_status'字段。 我应该在应用程序中处理和更新“air_status”字段?我想到了两个选择:

  1. 根据视图中对象的请求,视图将更新“air_status”字段。缺点是如果永远不会加载对象,则数据库中的“air_status”字段不会更新。
  2. 在当前时间等于'air_time'时,在模型文件中以某种方式检查以更新'air_status'。
  3. 我知道怎么做选项1但不知道2.什么是最好的解决方案?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以动态执行此操作,而无需在数据库中存储任何内容。有两种方法可以做到这一点。

模型属性

最简单的方法是只为模型添加属性。缺点是您无法通过此字段进行查询。

class Episode(models.Model):
    air_time = models.DateTimeField()
    end_time = models.DateTimeField()

    @property
    def air_status(self):
        if self.air_time < now():
            return 'UPCOMNG'
        elif self.air_time >= now() and self.end_time < now():
            return 'LIVE'
        else:
            return 'VOD'

现在,您可以像对象上的任何其他属性一样轻松访问它:episode.duration

Custom Queryset/Manager

如果您必须按此字段查询,还可以向模型添加自定义管理器。

class EpisodeManager(models.Manager):
    def upcoming(self):
        return self.get_queryset().filter(air_time__lt=now())

    def live(self):
        return self.get_queryset().filter(
            air_time__gte=now(),
            end_time__lt=now()
        )

    def vod(self):
        return self.get_queryset().filter(
            end_time__lte=now()
        )

class Episode(models.Model):
    ...

    objects = EpisodeManager()

现在你可以要求某种类型的剧集:例如Episode.objects.vod()

当然,您可以继续扩展并实施custom queryset,这样您就可以进行任意Episode模型查询,并像Episode.objects.filter(title='Game of Thrones').live()一样对其进行过滤。

相关问题