django-eav2入门执行makemigrations两类报错问题求助
问题原因
错误1:django.db.utils.OperationalError: no such table: eav_attribute
原因:你将Attribute.objects.create的数据库操作直接写在了models.py的顶层代码中。Django运行makemigrations命令时会先加载所有应用的models.py文件,此时django-eav2的数据库迁移还未执行,eav_attribute表根本不存在,直接操作数据库必然报错。
错误2:TypeError: register_eav() takes 0 positional arguments but 1 was given
原因:你使用的django-eav2 1.1.0版本中,register_eav装饰器需要加括号调用,正确写法是@register_eav(),而你没有加括号,直接写成@register_eav就会触发参数匹配错误。
解决步骤
- 第一步:删除
models.py中所有Attribute.objects.create的代码,初始化属性的操作不能放在models.py顶层执行。 - 第二步:确认
settings.py的INSTALLED_APPS列表中已经添加了'eav',这是很多新手容易遗漏的配置项。 - 第三步:选择其中一种注册方式即可:
- 函数注册方式:保留
eav.register(Answer)代码在models.py末尾即可 - 装饰器注册方式:将
@register_eav修改为@register_eav()
- 函数注册方式:保留
- 第四步:先执行django-eav2本身的迁移,创建基础表:
python manage.py migrate eav - 第五步:再执行你自己应用的迁移:
python manage.py makemigrations 你的应用名称 python manage.py migrate - 第六步:待所有迁移执行完成后,再创建你需要的Attribute属性。你可以通过
python manage.py shell进入Django交互环境,手动执行那几行Attribute.objects.create代码,也可以编写独立的数据迁移文件完成初始化,不要将这部分代码写在models.py中。
内容的提问来源于stack exchange,提问作者dataduck
相关产品推荐
相关产品推荐

