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

匿名 (未验证) 提交于 2019-12-03 03:03:02

问题:

I am attempting to add a 'created_at' field for all my models and am getting the following error...

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

In order, this is my work flow...

1) I put created_at = models.DateTimeField(auto_now_add=True) in my models.
2) I run python manage.py makemigrations and it displays the following prompt in my command line...

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) At this point I type in timezone.now() on all of the models and when finished it successfully creates the migrations file for me.

4) I run python manage.py migrate and get the TypeError message displayed above.

Things I have tried...

1) Looking through Stack Overflow for similar issues (to no avail)...
2) Deleteing the migrations file and attempting to use datetime.datetime.now()
3) Deleteing the migrations file and attempting to use the simple integer 1.

All of these attempts have been fruitless.

Full command line traceback...

(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' 

Full migration file...

# -*- 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,     ), ] 

回答1:

The problem is with the new 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, ), 

Clearly the default value is wrong. I think you have inserted it by mistake.

You should either specify the primary key of a user, or give a User object.



回答2:

I have had a similar problem and I would like to share how I solved this as it may be of benefit to others. This was a challenge to solve with little specific information from the Django documentation and this thread appears to be the best-phrased question on stackoverflow.

My situation:

  • I am new to Django and experimenting, and using the SQLLite database model
  • I had created a simple model, and during the migrate is asked the question about providing a one-off default, which I provided
  • From this point on the migrate process would not forget this default, and I could not migrate this further and was stuck

My solution:

  • Given that I am not in production and also not in large-scale development I adopted the approach to kill the database and all of the migrations and then to migrate again, which solved the problem
  • NOTE: If you have vested data in the database, then back up the data first or seek other guidance - there are other threads which show how to do this backup and restore, even between database management systems
  • under the project root, look for the file db.sqlite3 and rename or delete this which will force this to be recreated on the next migrate
  • under the migrations folder delete ALL of the migrations .py files - this will prevent these from being applied again when the database is recreated
  • run migrate again - which will create a clean database without attempting to reinstate the default

I accept that my approach is a bit of a hack but it worked for me, and also without any damage to my models which were all created perfectly - I did also fix the lack of the default which was causing the problem which was a mistake of mine in entering a char default for an integer field. However, there may be side-effects if you are further into your development and I would welcome suggestions on a safer approach to this problem.



回答3:

I have faced the same problem, I have tried as suggested above and I deleted only my migration file which is causing this issue (latest file created while applying python manage.py makemigrations), again I run python manage.py makemigrations, here I notice that previously I have given >>> timezone.now() as default for ForeignKey Field, this time I have set default value in my models.py file and my problem was solved.

Note: don't provide default values for ForeignKeys while migrating.



回答4:

None of those solutions work for me. But when I removed all files from migrations folder in my app folder in project and ran python manage.py migrate, everything worked fine and there were no more problems.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!