如何在一个模型与另外两个模型之间建立关系

How to make relation between one model to another two models

我正在使用 Django 框架创建简单的论坛站点,并且我已经创建了评论模型,此时我的评论模型与 Post 具有 OneToOne 关系,这意味着每个时刻都属于特定的 post,但我还想提供另一个功能。每个评论模型都应该有可能与 Post 对象相关 到 Answer 模型。答案模型就像在 Stack Overflow 中一样,你添加一个 Post,另一个用户可以向它添加一个答案。我想提一下,答案与 Post 的 OneToOne 关系太相关了,我认为这就足够了,不需要编辑。 总结:如何允许向 Post 对象或答案对象添加评论? 另外我想说的是,我正在考虑创建两个评论模型,即 PostComment 和 AnswerComment,但我得出的结论是非常糟糕的解决方案。

class Post(models.Model):
    subject = models.CharField(max_length=100)
    description = models.TextField(null=True)
    section = models.ForeignKey(Section, on_delete=models.CASCADE, null=True)
    author = models.ForeignKey(User, null=True, blank=True)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    slug = models.SlugField(max_length=100, null=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.subject

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def close(self):
        self.active = False
        self.save()


class Comment(models.Model):
    content = models.CharField(max_length=600)
    post = models.OneToOneField(Post, on_delete=models.CASCADE)
    author = models.ForeignKey(User, null=True, blank=True)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return "Comment to post: {0} added by {1} at {2}.".format(self.post.subject, self.author, self.published_date)


class Answer(models.Model):
    content = models.TextField()
    post = models.OneToOneField(Post, on_delete=models.CASCADE)
    author = models.ForeignKey(User, null=True, blank=True)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return "Answer to post: {0} added by {1} at {2}.".format(self.post.subject, self.author, self.published_date)

如果一个 Post 对象可以有多个评论,我认为您的评论字段中需要 ForeignKey。关于答案,也许你可以在你的评论中添加另一个字段,指向相关的对象答案,如果一个答案允许多个评论,则使用外键。

  • 答案只能关联到一个 post,因此一对一
  • 评论只能与一个 post 关联,因此一对一
  • 评论只能与一个答案关联,所以一对一

请记住 classes 的顺序在 Python 中很重要。将注释 class 放在末尾,这样您就可以在 Post 和 Answer 之间创建一对一的关系。在当前位置你只能用 Post.

class Post(models.Model):
   ##
class Answer(models.Model):
   ##
class Comment(models.Model):
   post = models.OneToOneField(Post, on_delete=models.CASCADE, null=True, blank=True)
   answer = models.OneToOneField(Answer, on_delete=models.CASCADE, null=True, blank=True)