我正在尝试将类别部分添加到我的博客宠物项目中;我觉得我差不多到了,但在工作的最后一部分,它给我带来了一个错误:"OperationalError at/no such table:blog_post_categories">
我的型号.py
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
categories = models.ManyToManyField('Category', related_name='posts')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
class Category(models.Model):
name = models.CharField(max_length=20)
我的观点.py
def home(request):
content = {
'posts': Post.objects.all()
}
return render(request, 'blog/home.html', content)
def blog_category(request, category):
posts = Post.objects.filter(
categories__name__contains=category
).order_by(
'-created_on'
)
content = {
'category': category,
'posts': posts
}
return render(request, 'blog/blog_category.html')
我真的不明白为什么,但调试器显示第0行的base.html
中有问题"在模板/media/john/DATA/DJANGO/WORKING/blog/templates/blog/base.html, error at line 0"
中
base.html模板中的一些代码
1 {% load static %}
2 <!DOCTYPE html>
3 <html lang="en" dir="ltr">
4 <head>
5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
8 <link rel="stylesheet" href="{% static 'blog/main.css' %}">
...
对于"OperationalError at / no such table: blog_post_categories"
,我认为您可能缺少迁移(manage.py makemigrations
/manage.py migrate
(。
所以,一天后,我厌倦了寻找bug,什么都不解决。
我的错误的解决方案是删除数据库(rm db.sqlite3
(并运行python3 manage.py migrate
希望它能帮助其他人解决这个问题。
p.S:我真的不知道为什么会出现这个错误,如果有人有答案,请告诉我,我对这个小但烦人的错误很好奇:(
发生此错误的原因是传递的输入中包含无效的架构或不受支持的字符。因此,您只需要通过运行以下查询来更新您的表类型
因此,通过这个查询,您正在更改列的字符集。尽管您的数据库有一个默认的字符集utf-8,但我认为数据库列在MySQL中也可能有不同的字符集。这是我使用的SQL查询:
参考
ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;