如何在一个模型与另外两个模型之间建立关系
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)
我正在使用 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)