执行Django makemigrations遇ValueError:无法序列化<User: jezdo>
问题描述
执行Django的makemigrations命令生成迁移文件时持续报错,报错核心信息为ValueError: Cannot serialize: <User: jezdo>。此前尝试创建CustomUserGroup2模型,将用户字段改为models.ManyToManyField(User)但迁移失败;删除该模型后仍无法生成任何迁移文件。
环境信息:
- Python 3.10.4
- Django 4.1.6
完整报错日志:
(.venv) C:\Users\jezdo\venv\chat\chat_proj>python manage.py makemigrations chat Migrations for 'chat': chat\migrations\0002_alter_customusergroup_custom_group_name_and_more.py - Alter field custom_group_name on customusergroup - Alter field users on customusergroup Traceback (most recent call last): File "C:\Users\jezdo\.venv\chat\chat_proj\manage.py", line 22, in <module> main() File "C:\Users\jezdo\.venv\chat\chat_proj\manage.py", line 18, in main execute_from_command_line(sys.argv) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line utility.execute() File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\__init__.py", line 440, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\base.py", line 402, in run_from_argv self.execute(*args, **cmd_options) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\base.py", line 448, in execute output = self.handle(*args, **options) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\base.py", line 96, in wrapped res = handle_func(*args, **kwargs) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\commands\makemigrations.py", line 239, in handle self.write_migration_files(changes) File "C:\Users\jezdo\.venv\lib\site-packages\django\core\management\commands\makemigrations.py", line 278, in write_migration_files migration_string = writer.as_string() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\writer.py", line 141, in as_string operation_string, operation_imports = OperationWriter(operation).serialize() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\writer.py", line 99, in serialize _write(arg_name, arg_value) File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\writer.py", line 63, in _write arg_string, arg_imports = MigrationWriter.serialize(_arg_value) File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\writer.py", line 282, in serialize return serializer_factory(value).serialize() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\serializer.py", line 221, in serialize return self.serialize_deconstructed(path, args, kwargs) File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\serializer.py", line 99, in serialize_deconstructed arg_string, arg_imports = serializer_factory(arg).serialize() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\serializer.py", line 50, in serialize item_string, item_imports = serializer_factory(item).serialize() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\serializer.py", line 50, in serialize item_string, item_imports = serializer_factory(item).serialize() File "C:\Users\jezdo\.venv\lib\site-packages\django\db\migrations\serializer.py", line 386, in serializer_factory raise ValueError( ValueError: Cannot serialize: <User: jezdo> There are some values Django cannot serialize into migration files. For more, see https://docs.djangoproject.com/en/4.1/topics/migrations/#migration-serializing
当前models.py中的CustomUserGroup代码:
class CustomUserGroup(models.Model): custom_group_name = models.CharField(max_length=50, unique=True) users= MultiSelectField(max_length=100,choices=users_list,unique=False) class Meta: verbose_name_plural = 'Custom Groups' ordering = ['custom_group_name'] def __unicode__(self): return self.custom_group_name
解决方案
- 核心问题:
users_list中直接存储了User实例对象,Django无法将数据库模型实例序列化到迁移文件中。MultiSelectField的choices必须是可序列化的原始数据类型(如元组),而非实际模型对象。 - 修复步骤:
- 修改
users_list生成逻辑:将内容改为(user.id, user.username)这类元组结构,避免直接使用User实例。如果需要动态生成choices,建议通过懒加载方式获取,不要在模型加载阶段直接查询数据库生成实例列表。 - 清理无效迁移文件:删除已生成的
0002_alter_customusergroup_custom_group_name_and_more.py文件,该文件已被错误序列化内容污染。 - 重新生成迁移:执行
python manage.py makemigrations chat,此时可正常生成迁移文件。 - 应用迁移:执行
python manage.py migrate chat完成数据库更新。
- 修改
- 优化建议:用户组与用户的关联更适合用Django原生的
ManyToManyField,它会自动创建中间表维护关联关系,符合数据库设计规范,也能彻底避免序列化问题。示例代码:
class CustomUserGroup(models.Model): custom_group_name = models.CharField(max_length=50, unique=True) users = models.ManyToManyField(User, related_name='custom_groups') class Meta: verbose_name_plural = 'Custom Groups' ordering = ['custom_group_name'] def __str__(self): # Python 3中用__str__替代__unicode__ return self.custom_group_name
内容的提问来源于stack exchange,提问作者Depadmil Ha
相关产品推荐
相关产品推荐

