【发布时间】:2020-12-15 20:10:53
【问题描述】:
晚上好! 我有个问题。我无法通过互联网找到如何解决我的问题。我想有一个数据库行,我可以在其中放置小时 - 不是日期时间或时间,而是例如 01:34(1 小时 34 分钟)。我不知道如何处理它,有人可以帮忙吗?
问候
【问题讨论】:
-
你的模型中有
TextField吗?
晚上好! 我有个问题。我无法通过互联网找到如何解决我的问题。我想有一个数据库行,我可以在其中放置小时 - 不是日期时间或时间,而是例如 01:34(1 小时 34 分钟)。我不知道如何处理它,有人可以帮忙吗?
问候
【问题讨论】:
TextField吗?
一种常见的解决方案是将分钟或秒存储在一个整数字段中,然后在输出或渲染时格式化总分钟数。
将秒显示为分钟的示例模板标签:秒
@register.filter
def custom_time_format(seconds_total):
minutes, seconds = divmod(seconds_total, 60)
return f"{minutes}:{seconds}"
模板代码示例,假设标签文件名为custom_time_tags.py
{% load custom_time_tags %}
{{ time_stored_as_int|custom_time_format }}
【讨论】:
您能否进一步详细说明您想要克服的限制? 例如,为什么 datetime 不适合您的需求?
如果没有任何其他信息,我会说您可以考虑将具有特定格式约束(即 H:M)的 TextField 用于输入,并且您可以将值保存为整数(旨在仅将小时和分钟转换为分钟)。
如果这来自用户输入,最好在模型表单或模型上执行验证(在失败时引发 ValidationError)。
例如,根据documentation,你应该可以做类似的事情
class CustomTimeField(models.IntegerField):
description = "A field to save time (str) H:M as tot minutes (int) in db, but act like a str"
def get_db_prep_value(self, value, *args, **kwargs):
if value is None:
return None
h, m = value.split(":")
return int(h * 60 + m)
def to_python(self, value):
if value is None or isinstance(value, int):
return value
try:
return f"{value//60}:{value%60}"
except (TypeError, ValueError):
raise ValidationError("This value must be a string or an int.")
def from_db_value(self, value, expression, connection, context):
return self.to_python(value)
def formfield(self, **kwargs):
from django.forms import TextField
defaults = {'form_class': TextField}
defaults.update(kwargs)
return super(CustomTimeField, self).formfield(**defaults)
【讨论】: