Django迁移后仍报错:无blog_marketreview.name列及blog_category表
解决Django数据库迁移相关错误
问题概述
遇到两个数据库迁移后报错的问题:
- 已在blog应用的MarketReview模型中定义name字段,执行
makemigrations和migrate后仍报错:no such column: blog_marketreview.name - blog应用中存在Category模型,迁移后仍报错:
django.db.utils.OperationalError: no such table: blog_category
已尝试删除迁移文件及整个迁移文件夹,但问题依旧。
相关代码
MarketReview模型(models.py)
class MarketReview(models.Model): post = models.ForeignKey(MarketPost, related_name="mreviews", on_delete=models.CASCADE) name = models.CharField(max_length=255) body = models.TextField() date_added = models.DateTimeField(auto_now_add=True) rate = models.PositiveSmallIntegerField(choices=RATE_CHOICES) def __str__(self): return '%s - %s' % (self.post.title, self.name)
MarketPost模型
class MarketPost(models.Model): title = models.CharField(max_length=100) price = models.DecimalField(default=0, max_digits=9, decimal_places=2) post_image = models.ImageField(null=True, blank=False, upload_to='marketplace_images/') content = models.TextField() #content = RichTextField(blank=True, null=True) date_posted = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.title + ' | ' + str(self.author) def get_absolute_url(self): return reverse('marketplace-detail', args=(str(self.id)))
报错模板代码
<hr> 27 <br><br> 28 29 {% if not post.mreviews.all %} 30 <h4>No reviews yet... Be the first one!</h4> 31 <a href="{% url 'add-marketreview' post.pk %}">Add a Review</a> 32 33 {% else %} 34 <a href="{% url 'add-marketreview' post.pk %}">Add a Review</a> 35 <br><br> 36 {% for review in post.mreviews.all %} 37 <h4>{{ user.name }}</h4> 38 <b>{{ review.name }} - {{ review.date_added }}</b> 39 <br> 40 {{ review.body }} 41 <br> 42 <br> 43 {% endfor %} 44 {% endif %} 45 {% endblock content %}
Category模型
class Category(models.Model): NameOfCategory = models.CharField(max_length=255) def __str__(self): return self.NameOfCategory def get_absolute_url(self): #return reverse('post-detail', kwargs={'pk': self.pk}) return reverse('blog-home')
解决方案
针对错误1:MarketReview.name字段不存在
检查迁移执行状态
运行命令查看blog应用的迁移记录:python manage.py showmigrations blog确认是否有未应用的迁移,或迁移文件是否正确包含name字段的创建逻辑。
验证数据库表结构
使用数据库管理工具(如sqlite3、pgAdmin)直接查看blog_marketreview表,确认是否存在name字段。若不存在,说明迁移未正确同步到数据库。重置迁移并重新同步
按以下步骤操作(注意先备份数据库):- 删除blog应用migrations目录下除
__init__.py外的所有文件 - 清理django_migrations表中属于blog应用的记录:
在shell中执行:python manage.py shellfrom django.db import connection with connection.cursor() as cursor: cursor.execute("DELETE FROM django_migrations WHERE app='blog';") - 重新生成迁移:
python manage.py makemigrations blog - 应用迁移:
python manage.py migrate blog
- 删除blog应用migrations目录下除
修复模板潜在错误
模板第37行的{{ user.name }}应为{{ review.name }},此处混淆了user和review对象,虽不是字段不存在的直接原因,但会导致后续渲染错误。
针对错误2:blog_category表不存在
确认模型与迁移状态
- 检查Category模型是否在blog应用的models.py中,且未被注释
- 运行
python manage.py showmigrations blog,确认是否生成了Category相关的迁移文件,且已标记为[X]应用
执行迁移重置流程
重复上述错误1中的迁移重置步骤,确保Category模型的迁移被正确生成并应用。检查INSTALLED_APPS配置
确认settings.py中INSTALLED_APPS包含'blog',否则Django不会处理该应用的模型迁移。
内容的提问来源于stack exchange,提问作者pyguy34
相关产品推荐
相关产品推荐

