TypeError:int()参数必须是字符串,类字节对象或数字,而不是' datetime.datetime'

时间:2015-12-26 16:52:16

标签: python django datetime

我正在尝试添加' created_at'所有型号的字段,我收到以下错误...

TypeError: int() argument must be a string, a bytes-like object or a number, not 'datetime.datetime'

按顺序,这是我的工作流程......

1)我把created_at = models.DateTimeField(auto_now_add=True)放在我的模特中 2)我运行python manage.py makemigrations并在命令行中显示以下提示...

You are trying to add a non-nullable field 'created_at' to comment 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)
2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()

3)此时我在所有模型上键入timezone.now(),完成后成功为我创建了迁移文件。

4)我运行python manage.py migrate并获得上面显示的TypeError消息。

我尝试过的事情......

1)通过Stack Overflow查找类似问题(无济于事)...
2)删除迁移文件并尝试使用datetime.datetime.now()
3)删除迁移文件并尝试使用简单整数1

所有这些尝试都没有结果。

完整的命令行追溯......

(env)alopex@Alopex:~/repos/hacker_news$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, sessions, hackernews, contenttypes
Running migrations:
  Rendering model states... DONE
  Applying hackernews.0003_auto_20151226_1701...Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/core/management/__init__.py", line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 200, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/migrations/executor.py", line 92, in migrate
    self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/migrations/migration.py", line 123, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards
    field,
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 382, in add_field
    definition, params = self.column_sql(model, field, include_default=True)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 145, in column_sql
    default_value = self.effective_default(field)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 210, in effective_default
    default = field.get_db_prep_save(default, self.connection)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/models/fields/related.py", line 910, in get_db_prep_save
    return self.target_field.get_db_prep_save(value, connection=connection)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 728, in get_db_prep_save
    prepared=False)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 968, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/home/alopex/repos/hacker_news/env/lib/python3.4/site-packages/django/db/models/fields/__init__.py", line 976, in get_prep_value
    return int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'datetime.datetime'

完整迁移文件...

# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2015-12-26 17:01
from __future__ import unicode_literals

import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc


class Migration(migrations.Migration):

dependencies = [
    migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ('hackernews', '0002_auto_20151224_1605'),
]

operations = [
    migrations.AddField(
        model_name='comment',
        name='created_at',
        field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2015, 12, 26, 17, 1, 23, 211181, tzinfo=utc)),
        preserve_default=False,
    ),
    migrations.AddField(
        model_name='comment',
        name='user',
        field=models.ForeignKey(default=datetime.datetime(2015, 12, 26, 17, 1, 28, 128127, tzinfo=utc), on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
        preserve_default=False,
    ),
    migrations.AddField(
        model_name='commentvote',
        name='created_at',
        field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2015, 12, 26, 17, 1, 34, 85491, tzinfo=utc)),
        preserve_default=False,
    ),
    migrations.AddField(
        model_name='post',
        name='created_at',
        field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2015, 12, 26, 17, 1, 37, 779457, tzinfo=utc)),
        preserve_default=False,
    ),
    migrations.AddField(
        model_name='postvote',
        name='created_at',
        field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2015, 12, 26, 17, 1, 41, 794803, tzinfo=utc)),
        preserve_default=False,
    ),
]

6 个答案:

答案 0 :(得分:7)

问题在于新的ForeignKey

migrations.AddField(
    model_name='comment',
    name='user',
    field=models.ForeignKey(default=datetime.datetime(2015, 12, 26, 17, 1, 28, 128127, tzinfo=utc), on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
    preserve_default=False,
),

显然,默认值是错误的。我认为你错误地插入了它。

您应该指定用户的主键,或者提供User对象。

答案 1 :(得分:3)

我遇到了类似的问题,我想分享一下我是如何解决这个问题的,因为它可能对其他人有益。这是一个挑战,只需要从Django文档中获取很少的特定信息,这个线程似乎是stackoverflow上最好的问题。

我的情况:

  • 我是Django的新手,正在尝试并使用SQLLite数据库模型
  • 我创建了一个简单的模型,在迁移过程中被问到关于提供一次性默认的问题,我提供了
  • 从这一点开始,迁移过程不会忘记此默认设置,我无法进一步迁移并且卡住了

我的解决方案:

  • 鉴于我没有投入生产,也没有进行大规模开发,我采用的方法是杀死数据库和所有迁移,然后再次迁移,这解决了问题
  • 注意:如果您在数据库中拥有既定数据,则先备份数据或寻求其他指导 - 还有其他线程显示如何执行此备份和恢复,即使在数据库管理系统之间也是如此
  • 在项目根目录下,查找文件 db.sqlite3 并重命名或删除它,这将强制在下次迁移时重新创建
  • 迁移文件夹下删除所有迁移 .py 文件 - 这将阻止在重新创建数据库时再次应用这些文件
  • 再次运行迁移 - 这将创建一个干净的数据库,而不尝试恢复默认

我接受我的方法有点黑客但它对我有用,而且对我的模型完全没有任何损害 - 我也确定了缺少导致问题的缺省我输入整数字段的字符默认值时的错误。但是,如果您进一步开发,可能会产生副作用,我欢迎提出更安全的方法来解决这个问题。

答案 2 :(得分:3)

这些解决方案都不适合我。但是,当我从项目中的app文件夹中的迁移文件夹中删除所有文件并运行python manage.py migrate时,一切正常,并且没有其他问题。

答案 3 :(得分:2)

我以非常干净的方式解决了这个问题。这是您需要做的

  • 转到“迁移”文件夹,然后搜索要迁移的模型的迁移文件。您会发现它的默认设置为timezone.now

  • 将其更改为默认值(删除default配置并设置null=True blank=True

  • 运行python manage.py migrate

那应该解决它。

答案 4 :(得分:1)

我遇到了同样的问题,我按照上面的建议尝试了,但我只删除了导致此问题的迁移文件(应用python manage.py makemigrations时创建的最新文件),再次运行python manage.py makemigrations,在这里我注意到之前我已经将>>> timezone.now()作为ForeignKey Field的默认值,这次我在models.py文件中设置了默认值,我的问题就解决了。

注意:迁移时不要为ForeignKeys提供默认值。

答案 5 :(得分:0)

对我来说,当我打开未迁移的文件并且在ForeignKey上将逗号分隔为null = True,blank = True时,它可以正常工作。

field = models.ForeignKey(null = True,blank = True,on_delete = django.db.models.deletion.CASCADE,to ='your_app.Model')