如何使用Django模板标记或Python处理随时间变化的条件
你会怎么处理 我需要能够根据每小时从流量表获得的一些数据,设置打开或关闭的条件。对于python和django来说非常陌生,所以如果这是一个愚蠢的问题,请原谅我 当仪表超过10英尺时,与仪表相关的区域被视为关闭,当仪表降至8英尺以下时,该区域重新打开。当一个区域关闭时,它必须保持关闭24小时。如果可能的话,我希望能够在Django的模板标记中设置逻辑。数据每小时填充到一个读数模型中(当前条件),站是另一个具有逻辑检查的模型(洪水位) 这是我在意识到考虑更高级的封闭区域的标准之前所拥有的如何使用Django模板标记或Python处理随时间变化的条件,python,django,Python,Django,你会怎么处理 我需要能够根据每小时从流量表获得的一些数据,设置打开或关闭的条件。对于python和django来说非常陌生,所以如果这是一个愚蠢的问题,请原谅我 当仪表超过10英尺时,与仪表相关的区域被视为关闭,当仪表降至8英尺以下时,该区域重新打开。当一个区域关闭时,它必须保持关闭24小时。如果可能的话,我希望能够在Django的模板标记中设置逻辑。数据每小时填充到一个读数模型中(当前条件),站是另一个具有逻辑检查的模型(洪水位) 这是我在意识到考虑更高级的封闭区域的标准之前所拥有的 <
<td><a href="{% url 'record_detail' pk=item.data.pk %}"><span
class="status">{% if item.data.stage_feet >= item.flood_stage %}</span>
<span class="alert label">Closed</span>{% else %}<span class="success
label">Open</span></a></td>{% endif %}
我认为最好的解决方案是在模板标签之外处理,在模型上加上某种标志。这将为您提供将状态直接绑定到实例的好处,这样您就可以知道它是
open
还是close
在HTML视图的范围之外。我的想法是对你们的模型做类似的事情
从django.utils导入时区
从日期时间导入时间增量
课程位置(models.Model):
...
is_closed=models.BooleanField(默认值=False)
closed_at=models.DateTimeField(null=True,blank=True)
def保存(自身、*args、**kwargs):
如果self.data.stage\u foots>=self.flood\u stage:
self.is_closed=True
如果self.closed_at为无:
self.closed_at=timezone.now()
elif self.closed_at和self.closed_at>self.reopen_at:
self.is_closed=False
self.closed_at=None
super(Location,self).save(*args,**kwargs)#如果使用Python 3,此行可以是:super().save(*args,**kwargs)
@财产
是否已打开(自身):
返回非self.u已关闭
@财产
def在(自我)处重新打开:
如果self.closed_at为无:
一无所获
其他:
在+时间增量返回self.closed_(天数=1)
我所做的是添加两个字段。一个是BooleanField
,作为状态标志,另一个是DateTimeField
,用于捕获时间并在24小时后处理开门
作为旁注,关于如何将这两个领域整合为一个领域,存在一个问题。我不建议现在就这么做,但绝对值得研究。好主意
因为你说已经有一个每小时保存一次数据的过程,所以我认为没有必要在模型之外做任何事情。一切都可以通过save()
方法处理
保存实例时,它会检查是否满足触发条件。如果有,它将设置is_closed
属性并存储datetime
如果没有,则检查时间是否已过,并重置标志和条件
为了方便起见,我还添加了一个已打开的属性
我还没有测试过这段代码。我认为最好的解决方案是在模板标签之外处理,在模型上加上某种标志。这将为您提供将状态直接绑定到实例的好处,这样您就可以知道它是
open
还是close
在HTML视图的范围之外。我的想法是对你们的模型做类似的事情
从django.utils导入时区
从日期时间导入时间增量
课程位置(models.Model):
...
is_closed=models.BooleanField(默认值=False)
closed_at=models.DateTimeField(null=True,blank=True)
def保存(自身、*args、**kwargs):
如果self.data.stage\u foots>=self.flood\u stage:
self.is_closed=True
如果self.closed_at为无:
self.closed_at=timezone.now()
elif self.closed_at和self.closed_at>self.reopen_at:
self.is_closed=False
self.closed_at=None
super(Location,self).save(*args,**kwargs)#如果使用Python 3,此行可以是:super().save(*args,**kwargs)
@财产
是否已打开(自身):
返回非self.u已关闭
@财产
def在(自我)处重新打开:
如果self.closed_at为无:
一无所获
其他:
在+时间增量返回self.closed_(天数=1)
我所做的是添加两个字段。一个是BooleanField
,作为状态标志,另一个是DateTimeField
,用于捕获时间并在24小时后处理开门
作为旁注,关于如何将这两个领域整合为一个领域,存在一个问题。我不建议现在就这么做,但绝对值得研究。好主意
因为你说已经有一个每小时保存一次数据的过程,所以我认为没有必要在模型之外做任何事情。一切都可以通过save()
方法处理
保存实例时,它会检查是否满足触发条件。如果有,它将设置is_closed
属性并存储datetime
如果没有,则检查时间是否已过,并重置标志和条件
为了方便起见,我还添加了一个已打开的属性
我还没有测试过这段代码。我不确定模板标记是否合适。你能把你的模型贴在这里吗?我认为更好的实现是在模型上设置一个带有
datetime
戳的标志。根据您的工作流程,可能有两种解决方案。其中之一可能是使用芹菜(www.celeryproject.org)之类的东西来运行定期检查以切换标志。谢谢你的评论@酿酒师您的模板中的item.data是什么?我不确定模板标签是否正确
class Location(models.Model):
station_code = models.CharField(max_length=10)
station_name = models.CharField(max_length=150)
site_name = models.CharField(max_length=150)
flood_stage = models.FloatField(null=True, blank=True)
flood_exit = models.FloatField(null=True, blank=True)
class Measurement(models.Model):
station = models.CharField(max_length=10)
stage_feet = models.FloatField(null=True, blank=True)
flow_kcfs = models.FloatField(null=True, blank=True)
msl_feet = models.FloatField(null=True, blank=True)
rain_inches = models.FloatField(null=True, blank=True)
measurement_time = models.DateTimeField()
location = models.ForeignKey(Location, on_delete=models.CASCADE)
geom = gismodels.PointField()
objects = gismodels.GeoManager()