我有一对简单的模型来处理时间序列:
class Ticker(models.Model):
name = CharField(max_length=100)
def latest_datapoint(self):
return self.datapoint_set.order_by('-timestamp')[0]
def latest_value(self):
return self.latest_data_point().value
def latest_timestamp(self)
return self.latest_data_point().timestamp
class DataPoint(models.Model):
ticker = ForeignKeyField(Ticker)
timestamp = DateTimeField()
value = FloatField()
然后我使用基于通用类的视图来制作股票代码列表:
class TickerListView(ListView):
model = Ticker
template_name = 'ticker-list.html'
最后,我实现了模板:
<table>
<thead>
<tr>
<th>Name</th>
<th>Latest Value</th>
<th>Latest Timestamp</th>
</tr>
</thead>
<tbody>
{% for object in object_list %} <----***Let's talk about this***
<tr>
<td>{{ object.name }}</td>
<td>{{ object.latest_value}}</td>
<td>{{ object.latest_timestamp}}</td>
</tr>
{% endfor % }
</tbody>
</table>
正如所写,这工作得很好。但我想使用 dictsort在模板中排序我的结果。{% for object in object_list|dictsort:"latest_value" %}
如果我用一切正常替换突出显示的行。但是,如果我改为将{% for object in object_list|dictsort:"latest_timestamp" %}
所有内容都写成空白,就好像我指定了一个无效的键来排序一样。知道这里发生了什么吗?
(假设:dictsort 在排序时不知道如何处理datetime.datetime
数据类型。)
谢谢。
为回应 Hieu Nguyen 添加:
谢谢你的评论!所以我当然会被烧毁,因为我把上面的例子过于简单化了。在我的实际代码中,方法定义Ticker
如下:
def latest_datapoint(self):
if self.datapoint_set:
return self.datapoint_set.order_by('-timestamp')[0]
else:
return None
def latest_value(self):
if self.latest_datapoint():
return self.latest_data_point().value
else:
return None
def latest_timestamp(self)
if self.latest_datapoint():
return self.latest_data_point().timestamp
else:
return None
当我尝试对latest_value
所有内容进行 dictsort 时,即使有几个 Tickers 有latest_value() = None
. 但是当我对latest_timestamp
其中一些进行排序时,None
Django 似乎完全跳过了这个表。这里的课程是否None
可以与 Float 数据进行清晰的比较,但不能与 DateTime 数据进行比较?如果是这样,将latest_timestamp_text
所有时间戳强制转换为YYYYMMDD HHMMSS
格式(None
转换为0
)的方法是否足以作为执行模板内字典排序的键?
再次编辑:
这似乎仍然没有解决问题。我实现了一个新方法:
def latest_timestamp_safe(self):
if self.latest_timestamp() is None:
return datetime.now().replace(year=1975)
else:
return self.latest_timestamp()
我已经确认这是有效的,并且我表中的所有行在我为 latest_timestamp_safe 制作的列中都显示了一个很好的 tz 感知日期时间。但是我仍然不能对这个键进行排序。有什么想法吗?
上次编辑:
以上不起作用。正如 Hieu 指出的那样,这不足以让“安全”的 datetime tz 意识到这一点。所以我放弃了这个想法,并采用了字符串化的想法。工作正常。None
以预期的方式进行比较。