首页 > 解决方案 > 新 Postgresql DB 中的 UUID 字段失败 ValidationError: ["'1' is not a valid UUID."]

问题描述

想知道是否有人可以阐明这个错误可能来自什么。我刚刚从 sqllite 迁移到 Postgresql,同时将我的 ID 字段更改为UUID. 对于大多数模型它都有效,但是我已经隔离了一些导致迁移失败的模型。

错误是:

AttributeError: 'int' object has no attribute 'replace' django.core.exceptions.ValidationError: ["'1' is not a valid UUID."]

正如我所说,这是一个新的数据库,并且不知道有任何代码会在迁移时创建行,因此不确定 1 来自何处。

这个问题看起来非常相似,但是提问者明确设置整数并尝试将其作为UUID

模型

import uuid

class Question(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

痕迹

        运行迁移:
      应用survey.0001_initial...Traceback(最近一次通话):
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/models/fields/__init__.py”,第 2363 行,在 to_python
        返回 uuid.UUID(值)
      __init__ 中的文件“/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/uuid.py”,第 137 行
        hex = hex.replace('urn:', '').replace('uuid:', '')
    AttributeError:“int”对象没有属性“replace”

    在处理上述异常的过程中,又出现了一个异常:

    回溯(最近一次通话最后):
      文件“manage.py”,第 15 行,在
        execute_from_command_line(sys.argv)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/core/management/__init__.py”,第 371 行,在 execute_from_command_line
        实用程序.execute()
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/core/management/__init__.py”,第365行,在执行
        self.fetch_command(子命令).run_from_argv(self.argv)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/core/management/base.py”,第 288 行,在 run_from_argv
        self.execute(*args, **cmd_options)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/core/management/base.py”,第 335 行,在执行
        输出 = self.handle(*args, **options)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/core/management/commands/migrate.py”,第 200 行,在句柄中
        fake_initial=fake_initial,
      迁移中的文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/migrations/executor.py”,第 117 行
        state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
      _migrate_all_forwards 中的文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/migrations/executor.py”,第 147 行
        state = self.apply_migration(状态,迁移,fake=fake,fake_initial=fake_initial)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/migrations/executor.py”,第 244 行,在 apply_migration
        state = migration.apply(state, schema_editor)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/migrations/migration.py”,第 122 行,在应用中
        operation.database_forwards(self.app_label,schema_editor,old_state,project_state)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/migrations/operations/fields.py”,第 84 行,在 database_forwards
        场地,
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/backends/base/schema.py”,第 407 行,在 add_field
        定义,参数 = self.column_sql(模型,字段,include_default=True)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/backends/base/schema.py”,第 152 行,在 column_sql
        default_value = self.effective_default(field)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/backends/base/schema.py”,第 224 行,在有效默认值中
        默认 = field.get_db_prep_save(默认,self.connection)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/models/fields/related.py”,第 936 行,在 get_db_prep_save
        返回self.target_field.get_db_prep_save(值,连接=连接)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/models/fields/__init__.py”,第 767 行,在 get_db_prep_save
        return self.get_db_prep_value(value, connection=connection,prepared=False)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/models/fields/__init__.py”,第 2354 行,在 get_db_prep_value
        值 = self.to_python(值)
      文件“/Users/jd/.virtualenvs/projectrisk_dev/lib/python3.6/site-packages/django/db/models/fields/__init__.py”,第 2368 行,在 to_python
        参数={'值':值},
    django.core.exceptions.ValidationError: ["'1' 不是有效的 UUID。"]

标签: pythondjangopostgresqlmigrationuuid

解决方案


推荐阅读