MongoDB与Django连接报错:TypeError:无主键值的模型实例不可哈希
解决Django + Djongo迁移时的TypeError: Model instances without primary key value are unhashable错误
核心问题
你的ModernConnectUsers模型中,UUIDField的默认值设置错误,导致Django在执行迁移后的权限创建流程时抛出主键未设置的错误。
解决方案
修改models.py中的user_id字段定义,将default=uuid.uuid4()改为default=uuid.uuid4(去掉函数调用的括号):
import uuid from django.db import models class ModernConnectUsers(models.Model): user_id = models.UUIDField(primary_key=True, default=uuid.uuid4) user_name = models.CharField(max_length=30, null=False)
后续操作
- 删除
modern_connect/migrations/目录下除__init__.py以外的所有迁移文件 - 重新执行迁移命令:
python manage.py makemigrations && python manage.py migrate
原因解释
- 当你写
default=uuid.uuid4()时,会在模型类定义阶段就执行uuid.uuid4()生成一个固定的UUID值,所有新实例的user_id默认都会使用这个固定值,既不符合UUID作为主键的唯一性要求,也会导致Django内部流程无法正确识别主键状态。 - 改为
default=uuid.uuid4(传递函数本身而非调用结果)后,Django会在每次创建新模型实例时调用uuid.uuid4()生成一个全新的UUID,确保主键唯一性的同时,让Django内部流程能正确识别主键已被赋值,避免触发self.pk == None的判断。
内容的提问来源于stack exchange,提问作者SarveshJoshi
相关产品推荐
相关产品推荐

