2017-11-10 4 views
1

을 적용 할 때, 내가 마이그레이션을 생성하는 makemigrations을 사용 :"형식 오류가 : 정수가 필요합니다 (얻었다 형 STR)"일부 모델을 추가 한 후 마이그레이션

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.7 on 2017-11-10 18:10 
from __future__ import unicode_literals 

from django.db import migrations, models 
import django.db.models.deletion 
import django.utils.timezone 
import uuid 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('restaurants', '0011_auto_20171024_1428'), 
     ('shop', '0003_auto_20171110_1505'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Customer', 
      fields=[ 
       ('email', models.CharField(max_length=255, unique=True)), 
       ('newsletter', models.BooleanField(default=False)), 
       ('key', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='clé')), 
      ], 
     ), 
     migrations.CreateModel(
      name='Order', 
      fields=[ 
       ('number_of_guests', models.PositiveSmallIntegerField()), 
       ('key', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='clé')), 
       ('date_created', models.DateTimeField(auto_now_add=True)), 
       ('date_changed', models.DateTimeField(auto_now=True)), 
       ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.Customer')), 
       ('deal', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='restaurants.Deal')), 
      ], 
     ), 
     migrations.AddField(
      model_name='payment', 
      name='date_created', 
      field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), 
      preserve_default=False, 
     ), 
     migrations.AddField(
      model_name='payment', 
      name='stripe_token', 
      field=models.CharField(default=django.utils.timezone.now, max_length=5000), 
      preserve_default=False, 
     ), 
     migrations.AddField(
      model_name='payment', 
      name='order', 
      field=models.ForeignKey(default=django.utils.timezone.now, on_delete=django.db.models.deletion.CASCADE, to='shop.Order'), 
      preserve_default=False, 
     ), 
    ] 

이 잘 보인다,하지만 난 마이그레이션을 실행할 때, 다음과 같은 역 추적에 실패

Applying shop.0004_auto_20171110_1910...Traceback (most recent call last): 
File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
File "{virtualenv}\lib\site-packages\django\core\management\__init__.py", line 364, in execute_from_command_line 
    utility.execute() 
File "{virtualenv}\lib\site-packages\django\core\management\__init__.py", line 356, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
File "{virtualenv}\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
File "{virtualenv}\lib\site-packages\django\core\management\base.py", line 330, in execute 
    output = self.handle(*args, **options) 
File "{virtualenv}\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
File "{virtualenv}\lib\site-packages\django\db\migrations\executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
File "{virtualenv}\lib\site-packages\django\db\migrations\executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
File "{virtualenv}\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
File "{virtualenv}\lib\site-packages\django\db\migrations\migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
File "{virtualenv}\lib\site-packages\django\db\migrations\operations\fields.py", line 87, in database_forwards 
    field, 
File "{virtualenv}\lib\site-packages\django\db\backends\sqlite3\schema.py", line 238, in add_field 
    self._remake_table(model, create_field=field) 
File "{virtualenv}\lib\site-packages\django\db\backends\sqlite3\schema.py", line 113, in _remake_table 
    self.effective_default(create_field) 
File "{virtualenv}\lib\site-packages\django\db\backends\base\schema.py", line 229, in effective_default 
    default = field.get_db_prep_save(default, self.connection) 
File "{virtualenv}\lib\site-packages\django\db\models\fields\related.py", line 963, in get_db_prep_save 
    return self.target_field.get_db_prep_save(value, connection=connection) 
File "{virtualenv}\lib\site-packages\django\db\models\fields\__init__.py", line 770, in get_db_prep_save 
    prepared=False) 
File "{virtualenv}\lib\site-packages\django\db\models\fields\__init__.py", line 2387, in get_db_prep_value 
    value = self.to_python(value) 
File "{virtualenv}\lib\site-packages\django\db\models\fields\__init__.py", line 2396, in to_python 
    return uuid.UUID(value) 
File "c:\python36\Lib\uuid.py", line 137, in __init__ 
    hex = hex.replace('urn:', '').replace('uuid:', '') 
TypeError: an integer is required (got type str) 

문제는 UUID 필드에서 온 것 같다,하지만 난 역 추적 내 마이그레이션 파일에 대한 참조를 표시하지 않는 한 나는 그것에 내 손가락을 배치 할 수 없습니다 .

문제를 해결하기 위해 내가 알아야 할 실마리가 있습니까? 어디에서 왔을 까?

답변

1

문제가 외래 키에 디폴트 값의 무효 형에 의해 발생합니다 :

class Payment(models.Model): 
    ... 
    order = models.ForeignKey(to='shop.Order', on_delete=django.db.models.deletion.CASCADE, 
           default=django.utils.timezone.now) 
    ... 

당신은 일반적으로 외래 키에 관련된 기본 키와 호환 결국 값을 기본 값을 할당해서는 안됩니다 datetime과 같은 잘못된 유형을 지정하지 마십시오.

이전 소스에서 필드의 출처가 AddField에서 추론되었습니다. 이러한 명확하지 않은 오류 메시지는 UUIDField 및 Django> = 1.9의 특별한 경우입니다. 당신의 관심을 끌기 위해 Django 1.8에서는 아무 것도 검사되거나 조정되지 않았고 유효하지 않은 UUID를 저장할 수있었습니다. 암시 적 기본 키 id을 사용하는 경우 오류 메시지는 지워집니다 (int() argument must be a string, a bytes-like object or a number, not 'datetime.datetime'). Django에보고 할 필요가 없습니다.

+0

와우, 네 말이 맞아. 여러 개의 날짜 필드를 추가했기 때문에 'timezone.now'를 실수로 입력 한 것처럼 보였습니다. 실수로 같은 기본값을 날짜가 아닌 다른 필드에도 추가했습니다. 고마워요! – Brachamul

관련 문제