About Post
class Category(models.Model):
""" 최상위 카테고리를 저장하는 모델입니다. """
category = models.CharField(max_length=40)
url = models.URLField(default="http://127.0.0.1:8000/base")
has_sub = models.BooleanField(default=False)
order = models.IntegerField()
created_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.category
class SubCategory(models.Model):
"""
하위 카테고리를 저장하는 모델입니다.
이 모델은 추후 더 나은 알고리즘이 발견될 시에 삭제될 수 있습니다.
"""
category = models.CharField(max_length=40)
url = models.URLField(default="http://127.0.0.1:8000/base")
parent = models.ForeignKey(Category, on_delete=models.CASCADE)
has_sub = models.BooleanField(default=False)
order = models.IntegerField()
created_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.category
def save(self, *args, **kwargs):
super(SubCategory, self).save(*args, **kwargs)
self.parent.has_sub = True
self.parent.save()
class S_SubCategory(models.Model):
"""
최하위 카테고리를 저장하는 모델입니다.
이 모델은 추후 더 나은 알고리즘이 발견될 시에 삭제될 수 있습니다.
"""
category = models.CharField(max_length=40)
url = models.URLField(default="http://127.0.0.1:8000/base")
parent = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
order = models.IntegerField()
created_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.category
def save(self, *args, **kwargs):
super(S_SubCategory, self).save(*args, **kwargs)
self.parent.has_sub = True
self.parent.save()
class Post(models.Model):
"""
전체검색을 위한 Post를 저장하는 모델입니다.
거의 대부분의 게시물 분류는 이 모델을 상속받으며, 추가적인 작업을 합니다.
이 모델 역시 카테고리가 있으며, order도 위와 같은 역할을 담당합니다.
"""
title = models.CharField(max_length=50)
writer = models.ForeignKey(Profile, related_name='post', on_delete=models.CASCADE)
write_date = models.DateTimeField(auto_now_add=True)
modify_date = models.DateTimeField(null=True, default=None)
hit = models.IntegerField(default=0)
text = models.TextField()
is_notice = models.BooleanField(default=False)
report_count = models.IntegerField(default=0)
post_user_like = models.ManyToManyField(Profile, related_name='post_like_set', through='PostLike')
post_user_report = models.ManyToManyField(Profile, related_name='post_report_set', through='PostReport')
objects = models.Manager()
objects_in = InheritanceManager()
def __str__(self):
return self.title
def up_count(self):
return Like.objects.filter(post_id=self.pk, likes=1).count()
def down_count(self):
return Like.objects.filter(post_id=self.pk, likes=-1).count()
def report_count(self):
return Report.objects.filter(post_id=self.pk).count()
class Comment(models.Model):
"""
모든 댓글을 저장하는 모델입니다.
대댓글은 parent로 구분하며, 댓글과 대댓글을 묶기 위해 group을 사용합니다.
group순으로 정렬하여 댓글을 출력합니다.
"""
parent = models.IntegerField(null=True)
group = models.IntegerField(default=1)
post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
author = models.ForeignKey(Profile)
text = models.TextField()
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(null=True, default=None)
report_count = models.IntegerField(default=0)
comment_user_like = models.ManyToManyField(Profile, related_name='comment_like_set', through='CommentLike')
comment_user_report = models.ManyToManyField(Profile, related_name='comment_report_set', through='CommentReport')
objects = models.Manager()
objects_in = InheritanceManager()
class Meta:
ordering = ('group',)
def __str__(self):
return self.text
def up_count(self):
return Like.objects.filter(comment_id=self.pk, likes=1).count()
def down_count(self):
return Like.objects.filter(comment_id=self.pk, likes=-1).count()
def report_count(self):
return Report.objects.filter(comment_id=self.pk).count()
def get_parent_pk(self):
return self.parent
class CommentLike(models.Model):
user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
comment = models.ForeignKey(Comment, null=True, on_delete=models.CASCADE)
likes = models.IntegerField()
class PostLike(models.Model):
user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
post = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
likes = models.IntegerField()
class CommentReport(models.Model):
user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
comment = models.ForeignKey(Comment, null=True, on_delete=models.CASCADE)
report_date = models.DateTimeField(auto_now_add=True)
report_reason = models.CharField(max_length=100)
def __str__(self):
return self.user.nickname
class PostReport(models.Model):
user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
post = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
report_date = models.DateTimeField(auto_now_add=True)
report_reason = models.CharField(max_length=100)
def __str__(self):
return self.user.nickname