我正在创建一个应用程序,其中“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但不知道2.什么是最好的解决方案?谢谢!
答案 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
。
如果您必须按此字段查询,还可以向模型添加自定义管理器。
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()
一样对其进行过滤。