Нулевое значение в столбце нарушает ограничение not-null после некорректного удаления объектов
Помогите, пожалуйста, я не понимаю, что происходит. Я написал простой блог, где можно добавлять посты и комментарии. Все работало хорошо.
views.py:
def add_comment_to_post(request, pk):
post = get_object_or_404(Post, pk=pk) # calls the given model and get the object, type = <class 'blog.models.Post'
if request.method == "POST": # if we posted data
form = CommentForm(request.POST)
if form.is_valid(): # if all fields are filled
comment = form.save(commit=False) # create instance and return which not saved in database "Comment" <class Comment>
comment.post = post # return Title
comment.author = request.user
comment.save()
return redirect('post_detail', pk=post.pk)
else:
form = CommentForm() # type = <class 'blog.forms.CommentForm'>
return render(request, 'blog/add_comment_to_post.html', {'form': form})
Но когда я добавил функцию для удаления комментариев, то мне пишет ошибку, вот так:
null значение в столбце "одобренный_коммент" отношения "блог_коммент" нарушает ограничение not-null
views.py:
def comment_remove(request, pk):
post = get_object_or_404(Post, pk=pk)
comment = get_object_or_404(Comment, pk=pk)
print(comment)
comment.delete()
return redirect('post_detail', pk=post.pk)
По-моему, я неправильно удалил комментарий. Я не понимаю, как работают первичные ключи, как связаны между собой комментарии и посты. И я не понимаю, как это понять.
Чтобы понять, как удалять комментарии, нам нужно понять, как работает pk (первичные ключи) и related_name.
Рассмотрим модель класса Comment. Обратите внимание на post и related_name='comments', а затем посмотрите его в post_detail.html.
.
class Comment(models.Model):
post = models.ForeignKey('blog.Post', on_delete=models.CASCADE,
related_name='comments')
author = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_comment = models.BooleanField(default=False)
post_detail.html:
<a class="btn btn-default" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>
{% for comment in post.comments.all %}
<div class="comment">
<a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
<div class="date">{{ comment.created_date }}</div>
<strong>{{ comment.author }}</strong>
<p>{{ comment.text|linebreaks }}</p>
</div>
{% empty %}
<p>No comments here yet :(</p>
{% endfor %}
post.comments.all - post является отношением для модели нашей модели Post. Имя related_name указывает имя отношения в обратном порядке, так что в данном случае доступ к комментариям данного объекта Post. [https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name]. Теперь вы знаете, как мы получаем comment.pk.
.
После этого, пожалуйста, обратите внимание, как мы удаляем комментарий. views.py:
def comment_remove(request, pk):
comment = get_object_or_404(Comment, pk=pk)
comment.delete()
return redirect('post_detail', pk=comment.post.pk)
Посмотрите на comment.post.pk. В нашей модели Comment у нас есть ключ post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name='comments'), который связан с нашей моделью Post. Вот и все!