You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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必须是可序列化的原始数据类型(如元组),而非实际模型对象。
  • 修复步骤:
    1. 修改users_list生成逻辑:将内容改为(user.id, user.username)这类元组结构,避免直接使用User实例。如果需要动态生成choices,建议通过懒加载方式获取,不要在模型加载阶段直接查询数据库生成实例列表。
    2. 清理无效迁移文件:删除已生成的0002_alter_customusergroup_custom_group_name_and_more.py文件,该文件已被错误序列化内容污染。
    3. 重新生成迁移:执行python manage.py makemigrations chat,此时可正常生成迁移文件。
    4. 应用迁移:执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:36:00