Python Django charfield正则表达式

Python Django charfield正则表达式,python,regex,django,django-models,Python,Regex,Django,Django Models,考虑一个Charfield,其最大长度为5 我想把hours和minutes放在这个CharField中,就像HH:MM一样 我不想使用models.TimeField,因为它存储的是时间,而不是小时和分钟的数量。我想让我的查菲尔德守住 示例: 8:45(8小时45分钟),这就是为什么我想添加一个正则表达式验证器,确保冒号前面的数字:小于24,后面的数字小于60 在正则表达式中我将如何执行此操作? 谢谢您的时间。这方面的正则表达式是: ^(?:0?[0-9]|1[0-9]|2[0-3]):[0-

考虑一个
Charfield
,其
最大长度
5

我想把
hours
minutes
放在这个
CharField
中,就像
HH:MM
一样

我不想使用
models.TimeField
,因为它存储的是时间,而不是小时和分钟的数量。我想让我的查菲尔德守住

示例:

8:45(8小时45分钟),这就是为什么我想添加一个正则表达式验证器,确保冒号前面的数字
小于24,后面的数字小于60

在正则表达式中我将如何执行此操作?


谢谢您的时间。

这方面的正则表达式是:

^(?:0?[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
  • ^
    匹配输入的开头
  • 0?[0-9]
    匹配
    0
    (可选)后跟
    0
    9
  • 1[0-9]
    macthes
    1
    后跟
    0
    9
  • 2[0-3]
    匹配
    2
    ,后跟
    0
    3
    之间的任何数字(因此我们匹配20-23)
  • 上述三种模式是
    -ed(
    |
    )的,因此它们中的任何一种都将匹配
  • 然后
    匹配文本
  • [0-5][0-9]
    匹配
    0
    5
    之间的任何数字,后跟
    0
    9
    之间的任何数字(这将匹配分钟00-59)
  • $
    匹配输入的结尾

但你应该做的是:

  • 通过继承
    django.core.validators.BaseValidator
  • 重写
    \uu调用
    方法,并在其中使用
    str.partition
    int
    转换进行验证
例如:

from django.core.validators import BaseValidator

class HourMinuteDurationValidator(BaseValidator):
    message = 'Some message'

    def __call__(self, value):
        cleaned_value = self.clean(value)
        hour, minute = cleaned_value.partition(':')

        try:
            hour, minute = int(hour), int(minute)
        except (TypeError, ValueError):
            raise ValidationError(self.message)

        if not (
            (0 <= hour <= 23) and (0 <= minute <= 59)
        ):
            raise ValidationError(self.message)
从django.core.validators导入BaseValidator
类HourMinuteDurationValidator(BaseValidator):
message='Some message'
定义调用(自身,值):
已清除值=自清除(值)
小时,分钟=分区(“:”)
尝试:
小时,分钟=整数(小时),整数(分钟)
除了(TypeError、ValueError):
引发验证错误(self.message)
如果不是(
(0试试这个:

charfield=models.charfield(详细名称='…',最大长度=。。。,
validators=[validators.RegexValidator(
r'^(0[0-9]| 1[0-9]| 2[0-3]):[0-5][0-9]$)]

将匹配任何HH:MM但不匹配H:MM H:M

您尝试过什么?这需要一个非常简单的正则表达式。是的,我意识到了,但在您结束我的问题xD后。我只是不知道如何查找它,但现在我知道了。谢谢您的时间。这也很好。很好,您包括了这一点。它将帮助其他来这里但不知道的人“我不想使用正则表达式。@AnthonyMartinez正则表达式比字符串操作要昂贵得多。因此,如果可以避免,请这样做。OTOH,如果必须使用它,请查看是否可以事先编译它(
re.compile
),如果您有这样的选择,请将其保存在最高可用范围内。啊!我明白了。我知道进入regex的方法,但从未真正考虑过它的成本。谢谢,