0

我在使用 DurationField 和 TimeField 时运行 python manage.py migrate 时遇到了这个错误,它们都给了我一个:

return int(round(value.total_seconds() * 1000000))
AttributeError: 'int' object has no attribute 'total_seconds'

我在这个站点上看到了这个错误,但仅适用于 Django 1.8。目前,我正在使用 Django 1.10。我已经尝试过这些建议:

DurationField(default=timedelta()), 
DurationField(), 
DurationField(default=timedelta()), 
DurationField(default=int(timedelta(minutes=20).total_seconds())). 

我的模型目前看起来像:

class SomeModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    lunchnumber = models.IntegerField(null=True, blank=True)
    role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES,null=True, blank=True)
    breaktime = models.DurationField(default=timedelta(minutes=45))

    def to_python(self, value):
        if value is None:
            return value
        if isinstance(value, datetime.timedelta):
            return value
        try:
            parsed = parse_duration(value)
        except ValueError:
            pass
        else:
            if parsed is not None:
                return parsed

解决 Prakhar Trivedi 的问题:我不知道什么值不能很好地工作。我假设这是 django 尝试填充该数据库表的默认值。我之所以有这种印象是因为......在 get_db_prep_value return int(round(value.total_seconds() * 1000000)) AttributeError: 'int' object has no attribute 'total_seconds'

解决 iklinac 的答案:

我进去并添加了 default=timedelta(minutes=45)。我确实从日期时间导入了它,但我觉得我错过了一些东西。我对此很陌生,还没有看到 to_python 函数。我错过了什么我仍然遇到同样的错误?

4

2 回答 2

1

请检查您是否从 datetime 包中导入 timedelta :)

from datetime import timedelta

这两个应该工作

DurationField(default=timedelta(minutes=20))
DurationField(default=timedelta())

DurationField 的 to_python 函数如下

    if value is None:
        return value
    if isinstance(value, datetime.timedelta):
        return value
    try:
        parsed = parse_duration(value)
    except ValueError:
        pass
    else:
        if parsed is not None:
            return parsed

如果您仍然遇到 timedelta 问题,您可以使用 parse_duration 代码注释中所述的其中一种格式

def parse_duration(value):
    """Parses a duration string and returns a datetime.timedelta.

    The preferred format for durations in Django is '%d %H:%M:%S.%f'.

    Also supports ISO 8601 representation.
    """
    match = standard_duration_re.match(value)
    if not match:
        match = iso8601_duration_re.match(value)
    if match:
        kw = match.groupdict()
        if kw.get('microseconds'):
            kw['microseconds'] = kw['microseconds'].ljust(6, '0')
        kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None}
        return datetime.timedelta(**kw)
于 2017-01-31T12:11:20.873 回答
0

我有同样的问题,iklinac 的回答帮助了我。

一旦我运行 python manage.py makemigrations 并显示

You are trying to change the nullable field 'duration' on task to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
 3) Quit, and let me add a default in models.py

所以我将 DurationField 的懒惰原因设置为 0...

之后错误一直显示...

通过看到这个答案,我发现在运行“python manage.py migrate”时,它实际上在名为 migrations 的文件夹中运行了 000x_auto_xxxx.py。所以我找到了包含 field=models.DurationField(default=0) 的 .py 文件并将其更改为正确的方式,最终解决了问题。

希望这可能会有所帮助

于 2019-07-06T17:21:31.973 回答