Django电商项目admin.E030错误求助:无法识别Category模型的name字段
Django电商项目admin.E030错误求助:无法识别Category模型的name字段
看起来你遇到的问题根源是模型代码里的语法错误,加上之前迁移文件的遗留问题导致的,我帮你一步步排查解决:
1. 先修复models.py里的核心错误
看你提供的Category模型代码,有两个关键问题:
name字段末尾多了个逗号:name = models.CharField(max_length = 150, db_index = True),这个逗号会让Python把这个字段定义当成一个元组,Django无法正确识别为模型字段——这就是为什么第一次迁移时数据库里没有生成name字段的直接原因!- 类内部代码缩进错误:
class Meta和__str__方法没有缩进到Category类内部,属于类外代码,Django也没法识别这些配置。
修正后的Category模型代码应该是这样的:
from django.db import models from django.contrib.auth.models import User class Category(models.Model): name = models.CharField(max_length=150, db_index=True) # 去掉末尾逗号,统一缩进 slug = models.SlugField(max_length=150, unique=True) class Meta: verbose_name_plural = 'Categories' def __str__(self): return self.name
你的Product模型也存在同样的缩进问题,需要把class Meta和__str__方法缩进类内部,修正后代码如下:
class Product(models.Model): category = models.ForeignKey(Category, related_name='product', on_delete=models.CASCADE) created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='product_creator') title = models.CharField(max_length=150) author = models.CharField(max_length=150, default='admin') description = models.TextField(blank=True) image = models.ImageField(upload_to='images/') slug = models.SlugField(max_length=150) price = models.DecimalField(max_digits=4, decimal_places=2) in_stock = models.BooleanField(default=True) is_active = models.BooleanField(default=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) class Meta: verbose_name_plural = 'Products' ordering = ('-created',) def __str__(self): return self.title
2. 清理旧的迁移遗留问题
因为之前的迁移文件是基于错误模型生成的,即使手动修改了数据库,Django的迁移系统还是会有冲突。如果是开发环境且数据库没有重要数据,建议按以下步骤操作:
- 找到你的app目录下的
migrations文件夹,删除里面除了__init__.py之外的所有文件 - 删除项目根目录下的
db.sqlite3数据库文件(如果用的是默认SQLite) - 重新生成迁移文件:
python manage.py makemigrations
- 应用迁移到数据库:
python manage.py migrate
3. 验证修复效果
完成上面的步骤后,重启你的Django服务器,再尝试访问admin后台或运行其他Django命令,应该就不会再出现无法识别name字段的错误了。
补充说明:admin.E030错误通常就是指list_display里配置的字段在模型中不存在,之前因为模型语法错误导致Django没识别到name字段,所以admin会报这个错,修复模型后就能解决。
备注:内容来源于stack exchange,提问作者ArceusLegend50
相关产品推荐
相关产品推荐

