Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Django模板标记或Python处理随时间变化的条件_Python_Django - Fatal编程技术网

如何使用Django模板标记或Python处理随时间变化的条件

如何使用Django模板标记或Python处理随时间变化的条件,python,django,Python,Django,你会怎么处理 我需要能够根据每小时从流量表获得的一些数据,设置打开或关闭的条件。对于python和django来说非常陌生,所以如果这是一个愚蠢的问题,请原谅我 当仪表超过10英尺时,与仪表相关的区域被视为关闭,当仪表降至8英尺以下时,该区域重新打开。当一个区域关闭时,它必须保持关闭24小时。如果可能的话,我希望能够在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()