我创建了一个名为Post的模型,并将其放置在以下路径中: MyProject / Postapp / models 如下:
class Post(models.Model):
user = models.ForeignKey(User, related_name="posts",
on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(Group, related_name="posts",null=True,
blank=True, on_delete=models.CASCADE)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = misaka.html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"posts:single",
kwargs={
"username": self.user.username,
"pk": self.pk
}
)
class Meta:
ordering = ["-created_at"]
unique_together = ["user", "message"]
因此,在下面,我想向用户创建的每个帖子添加评论,...。我应该启动一个新应用(Commentapp,...)还是在当前路径中创建模型并在Post模型中添加一些字段?
答案 0 :(得分:1)
答案与任何语言(至少在具有某种模块化概念的任何语言中)的任何“模块”都是相同的:您想要强大的内聚力(模块的功能应紧密相关)和低耦合(您的模块应具有尽可能少的依赖性,并且您特别不希望循环依赖性)。
在您的情况下,Comments
与Posts
显然密切相关,因此将它们放在一起(强大的内聚力)是很有意义的,而将它们拆分为不同的ap实际上会增加依赖性(并且可能是循环的) ),这样会增加耦合。
注意:除非您想要一个可以与其他任何模型一起使用的通用comments
应用程序(在这种情况下,one already exists),但是根据经验,我不会陷入这种过早的概括-最常见的是,您最终没有将“通用”模型与其他任何东西一起使用,因此,它所购买的只是额外的复杂性(其中相当一部分)而没有真正的好处。仅将现有contrib.comments
应用程序最终从django主干中删除的一点就足以说明这不是通用可重用应用程序的最佳选择(就我而言,我曾经在一个项目,然后将其转储并重新实现我自己的模型,该模型以所需的方式以更少的代码和更好的性能工作了。
答案 1 :(得分:0)
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)
def approve(self):
self.approved_comment = True
self.save()
def __str__(self):
return self.text