【问题标题】:Django 1.7 migrations - datetime typeerrorDjango 1.7 迁移 - 日期时间类型错误
【发布时间】:2014-11-06 13:55:59
【问题描述】:

我有一个大问题,我无法随心所欲地迁移我的数据库。我测试了很多东西(甚至直接写在数据库中......)。它与 Django 1.7.1 一起运行,我的数据库与 Sqlite3 一起存储。所以这是我的问题:

我有一个这样的模型:

from django.db import models
import datetime

class UserUsingTime(models.Model):
    userid = models.CharField(max_length = 30)
    using_time = models.DateTimeField(default = datetime.time())

(我想做的是存储一个计时器。例如,可能在比赛中的所有时间。)

我在模型的末尾添加了这一行:

app_name = models.CharField(max_length = 20, null = True)

然后我运行python manage makemigrations my_app_name,结果:

Migrations for 'my_app_name':
  0003_userusingtime_app_name.py:
    - Add field app_name to userusingtime

所以现在一切都很好:) 但是当我尝试运行 python manage migrate 时,我有大量的错误行:


    Operations to perform:
      Apply all migrations: admin, contenttypes, my_app_name, auth, sessions
    Running migrations:
      Applying my_app_name.0003_userusingtime_app_name...Traceback (most recent call last):
      File "./manage.py", line 8, in 
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
        self.execute(*args, **options.__dict__)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
        output = self.handle(*args, **options)
      File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 160, in handle
        executor.migrate(targets, plan, fake=options.get("fake", False))
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 63, in migrate
        self.apply_migration(migration, fake=fake)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 97, in apply_migration
        migration.apply(project_state, schema_editor)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 107, in apply
        operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
      File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 37, in database_forwards
        field,
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/schema.py", line 167, in add_field
        self._remake_table(model, create_fields=[field])
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/schema.py", line 128, in _remake_table
        self.create_model(temp_model)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 209, in create_model
        definition, extra_params = self.column_sql(model, field)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 121, in column_sql
        default_value = self.effective_default(field)
      File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 184, in effective_default
        default = field.get_db_prep_save(default, self.connection)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 627, in get_db_prep_save
        prepared=False)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1286, in get_db_prep_value
        value = self.get_prep_value(value)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1269, in get_prep_value
        value = super(DateTimeField, self).get_prep_value(value)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1171, in get_prep_value
        return self.to_python(value)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1228, in to_python
        parsed = parse_datetime(value)
      File "/usr/local/lib/python2.7/dist-packages/django/utils/dateparse.py", line 70, in parse_datetime
        match = datetime_re.match(value)
    TypeError: expected string or buffer

所以我真的不知道下一步该做什么......另外,似乎有一个datetime 错误,我无法解释,因为我没有在我的模型中触摸任何datetime 对象......好奇怪!

请帮我解决这个问题 :) 我提前感谢你们(Y)!

【问题讨论】:

    标签: python django datetime migration


    【解决方案1】:

    您的using_time 字段定义有问题。 Django 抱怨是因为您试图将 time 对象存储在 datetime 容器中。

    DateTimeField 对于您要表示的内容(时间长度)来说只是错误的字段类型。您可以将其切换为TimeField,或者简单地使用FloatFieldIntegerField 来存储秒或毫秒。

    (为什么现在只抛出迁移错误?我认为这是因为这个错误没有在早期版本的 Django 中发现,这是你第一次真正的迁移(即不是最初的假迁移)已在 1.7 中尝试过。)

    【讨论】:

    • 不,我想做的是存储一个计时器。例如,在比赛中可能一直如此。我想存储这种数据。所以我为此使用了 DateTimeField。并且 datetime.time() 设置为默认值表示默认情况下它将设置为零。不过还是非常感谢:)
    • 好的,非常感谢!我会在几毫秒内存储我的数据然后:D 很抱歉我不能投票......(声誉太低):(
    猜你喜欢
    • 2015-01-28
    • 2015-02-09
    • 2014-12-13
    • 2016-07-04
    • 2015-03-02
    • 1970-01-01
    • 2015-03-31
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多