外键约束失败

时间:2021-01-15 13:34:47

标签: django sqlite foreign-keys

我关注了 Coreys 博客应用,并集成了评论功能。我现在在尝试删除附有评论的评论时出现问题。

在 stackoverflow 上阅读了大约一百万个帖子后,大多数人会提到 USER on_delete,但我的似乎已经在 CASCADE 上了。

奇怪的问题。 用户可以删除没有评论的帖子

问题是评论不能删除的帖子(外键约束问题)

错误: 邮政 请求网址:http://127.0.0.1:8000/post/31/delete/ Django 版本:3.1.4 异常类型:IntegrityError 异常值:
外键约束失败

我应该能够创建一个帖子,让多个用户评论该帖子。然后,如果帖子的用户希望删除帖子,则应删除所有评论(显然 - 已添加级联)

  • 目前我能解决这个问题的唯一方法是删除一个 用户发表评论,然后删除帖子。

models.py(后置函数)

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.CharField(choices=cat_new_choice, max_length=200,default='Onboarding')
    likes = models.ManyToManyField(User, related_name='blog_posts', blank=True)
    #user who created this post, then the user gets deleted - what happens to the post? this will delete his post as well
    
    def __str__(self):
        return self.title
    
    def total_likes(self):
        return self.likes.all().count()
 
    def get_absolute_url(self):
            return reverse('post-detail', kwargs={'pk': self.pk}) 

models.py 评论功能

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
    body = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE )

    def user_comment_post(sender, instance, *args, **kwargs):
        comment = instance
        post = comment.post
        text_preview = comment.body[:90]
        sender = comment.user

        notify = Notification(post=post, sender=sender, user=post.author, text_preview=text_preview, notification_type=2)
        notify.save()

    def user_delete_comment(sender, instance, *args, **kwargs):
            comment = instance
            post = comment.post
            sender = comment.user

            notify = Notification.objects.filter(post=post, user=post.author, sender=sender, notification_type=2)
            notify.delete()

views.py(删除视图)

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    success_url = '/'

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

post-detail.html(删除功能) {% if object.author == 用户 %}

    <div class="float-right">

                <br />
                <a class="btn btn-secondary btn-sm " href="{% url 'post-update' object.id %}">Update</a>
                <a class="btn btn-danger btn-sm " href="{% url 'post-delete' object.id %}">Delete</a>
    </div>
{% endif %}

更新:所有notification.py

class Notification(models.Model):
    NOTIFICATION_TYPES = (
        (1, 'Like'),
         (2, 'Comment')
         )
         
    post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name="notif_post", blank=True, null= True)
    sender =  models.ForeignKey(User, on_delete=models.CASCADE, related_name="notif_from_user")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notif_to_user")
    notification_type = models.IntegerField(choices= NOTIFICATION_TYPES)
    text_preview = models.CharField(max_length=90, blank=True)
    date = models.DateTimeField(auto_now_add=True)
    is_seen = models.BooleanField(default=False)

0 个答案:

没有答案