列中的空值在错误删除对象后违反了非空约束

  • 本文关键字:约束 对象 空值 删除 错误 django
  • 更新时间 :
  • 英文 :


帮帮我,我不知道这是怎么回事。我写了一些简单的博客,在那里我可以添加帖子和评论。

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})

但是当我添加一个删除注释的函数时,它给我写了一个错误,像这样:

列" approved_comments "关系" blog_comments "违反非空约束

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)

我想我删除评论错误。我不明白主键是如何工作的,评论和帖子是如何相互关联的。我不知道该怎么理解。

p。models.py:

class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, 
related_name="author_name",
on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
def approved_comments(self):
return self.comments.filter(approved_comment=True)
class Meta:
ordering = ['-published_date']
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),
# parent = models.ForeignKey('self', null=True, blank=True, 
related_name='replies')
def approve(self):
self.approved_comment = True
self.save()
def __str__(self):
return 'Comment {} by {}'.format(self.text, self.author)

pp。forms.py:

from xml.etree.ElementTree import Comment
from django import forms
from .models import Post, Comment
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'text',)
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('text',)

要了解如何删除注释,我们需要了解pk(主键)和related_name是如何工作的。

让我们看看模型类注释。请注意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对象的Comment。[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。在我们的评论模型中,我们有键post = models.ForeignKey('blog。帖子,on_delete =模型。CASCADE, related_name='comments'),它与我们的Post Model相关。就是这样!

最新更新