/books/add_review_to_book 处的 Django OperationalError
Django OperationalError at /books/add_review_to_book
我被这个错误卡住了 2 天,我是 Django 的新手,我正在尝试为 books.When 写评论我打开评论表单并输入一些文本,然后提交,我收到此错误 -
OperationalError at /books/add_review_to_book/8
table books_review has no column named book_id.
代码对我来说一切正常:
我的models.py
class Book(models.Model):
user = models.ForeignKey(User, default=1)
title = models.CharField(max_length=100, null=True)
author = models.ForeignKey('Author', on_delete=models.CASCADE, null=True)
def __str__(self):
return self.title + ' - ' + self.author
class Author(models.Model):
first_name = models.CharField(max_length=50, null=True)
last_name = models.CharField(max_length=50, null=True)
class Review(models.Model):
book = models.ForeignKey('Book', related_name='reviews')
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.text
我的views.py:
def add_review_to_book(request, id):
book = get_object_or_404(Book, id=id)
if request.method == "POST":
form = ReviewsForm(request.POST)
if form.is_valid():
review = form.save(commit=False)
review.book = book
review.save()
return redirect('book_detail.html', id=book.id)
else:
form = ReviewsForm()
return render(request, 'books/add_review_to_book.html', {'form': form})
我的forms.py:
class ReviewsForm(forms.ModelForm):
class Meta:
model = Review
fields = ('author', 'text')
我的 html 采用 add_review_to_book:
的形式
{% block content %}
<hr>
<a class="btn btn-default" href="{% url 'add_review_to_book' id=book.id %}">Add review</a>
{% for review in book.reviews.all %}
{% if user.is_authenticated %}
<div class="review">
<div class="date">
{{ review.created_date }}
</div>
<strong>{{ review.author }}</strong>
<p>{{ review.text|linebreaks }}</p>
</div>
{% endif %}
{% empty %}
<p>No comments</p>
{% endfor %}
{% endblock content %}
我删除了迁移并重新创建了它们,当我尝试写评论时仍然出现同样的错误。提前致谢。
编辑:在 dbshell -
中 运行 .schema books_review 之后的结果
CREATE TABLE IF NOT EXISTS "books_review" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "text" text NOT NULL);
还是table books_review has no column named book_id
:(
如我所见,您没有两个字段 book
和 author
,可能您中断了迁移,请尝试执行后续步骤:
- 转储数据
./manage.py dumpdata auth.user > users.json
./manage.py dumpdata books.book > book.json
- 删除 sqlite 数据库
rm db.sqlite3
- 删除迁移文件夹
rm -rf books/migrations
- 重新创建 books\migrations
mkdir books/migrations
- 创建init.py
touch books\migrations\__init__.py
- 创建新迁移
./manage.py makemigrations
- 应用迁移
./manage.py migrate
- 加载数据
./manage.py loaddata *.json
- 测试你的代码
希望对你有帮助
我被这个错误卡住了 2 天,我是 Django 的新手,我正在尝试为 books.When 写评论我打开评论表单并输入一些文本,然后提交,我收到此错误 -
OperationalError at /books/add_review_to_book/8
table books_review has no column named book_id.
代码对我来说一切正常:
我的models.py
class Book(models.Model):
user = models.ForeignKey(User, default=1)
title = models.CharField(max_length=100, null=True)
author = models.ForeignKey('Author', on_delete=models.CASCADE, null=True)
def __str__(self):
return self.title + ' - ' + self.author
class Author(models.Model):
first_name = models.CharField(max_length=50, null=True)
last_name = models.CharField(max_length=50, null=True)
class Review(models.Model):
book = models.ForeignKey('Book', related_name='reviews')
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.text
我的views.py:
def add_review_to_book(request, id):
book = get_object_or_404(Book, id=id)
if request.method == "POST":
form = ReviewsForm(request.POST)
if form.is_valid():
review = form.save(commit=False)
review.book = book
review.save()
return redirect('book_detail.html', id=book.id)
else:
form = ReviewsForm()
return render(request, 'books/add_review_to_book.html', {'form': form})
我的forms.py:
class ReviewsForm(forms.ModelForm):
class Meta:
model = Review
fields = ('author', 'text')
我的 html 采用 add_review_to_book:
的形式{% block content %}
<hr>
<a class="btn btn-default" href="{% url 'add_review_to_book' id=book.id %}">Add review</a>
{% for review in book.reviews.all %}
{% if user.is_authenticated %}
<div class="review">
<div class="date">
{{ review.created_date }}
</div>
<strong>{{ review.author }}</strong>
<p>{{ review.text|linebreaks }}</p>
</div>
{% endif %}
{% empty %}
<p>No comments</p>
{% endfor %}
{% endblock content %}
我删除了迁移并重新创建了它们,当我尝试写评论时仍然出现同样的错误。提前致谢。
编辑:在 dbshell -
中 运行 .schema books_review 之后的结果CREATE TABLE IF NOT EXISTS "books_review" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "text" text NOT NULL);
还是table books_review has no column named book_id
:(
如我所见,您没有两个字段 book
和 author
,可能您中断了迁移,请尝试执行后续步骤:
- 转储数据
./manage.py dumpdata auth.user > users.json
./manage.py dumpdata books.book > book.json
- 删除 sqlite 数据库
rm db.sqlite3
- 删除迁移文件夹
rm -rf books/migrations
- 重新创建 books\migrations
mkdir books/migrations
- 创建init.py
touch books\migrations\__init__.py
- 创建新迁移
./manage.py makemigrations
- 应用迁移
./manage.py migrate
- 加载数据
./manage.py loaddata *.json
- 测试你的代码
希望对你有帮助