【问题标题】:Django model - hours calculatorDjango 模型 - 小时计算器
【发布时间】:2020-12-15 20:10:53
【问题描述】:

晚上好! 我有个问题。我无法通过互联网找到如何解决我的问题。我想有一个数据库行,我可以在其中放置小时 - 不是日期时间或时间,而是例如 01:34(1 小时 34 分钟)。我不知道如何处理它,有人可以帮忙吗?

问候

【问题讨论】:

  • 你的模型中有TextField吗?

标签: python django model


【解决方案1】:

一种常见的解决方案是将分钟或秒存储在一个整数字段中,然后在输出或渲染时格式化总分钟数。

将秒显示为分钟的示例模板标签:秒

@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 }} 

【讨论】:

    【解决方案2】:

    您能否进一步详细说明您想要克服的限制? 例如,为什么 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)
    

    【讨论】:

    • 没有限制,它应该像一个小时日志,然后我可以总结一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多