@python_2_unicode_compatible
class Comment(models.Model):
"""使用Django中的ContentType, 同时关联用户对模型的投票"""
uuid_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
content = models.CharField(max_length=255, verbose_name="评论内容")
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="commentator", on_delete=models.SET_NULL,
verbose_name='评论者')
reply_to = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_DEFAULT, default=1, null=True, blank=True,
related_name='replier', verbose_name='被回复者')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
"""多级评论需要 自关联"""
root = models.ForeignKey('self', models.CASCADE, null=True, blank=True, related_name='root_comment',
verbose_name='根评论')
parent = models.ForeignKey("self", models.SET_NULL, related_name="parent_comment", null=True, blank=True,
verbose_name='上级评论')
content_type = models.ForeignKey(ContentType, related_name='comment_on', on_delete=models.CASCADE)
object_id = models.CharField(max_length=255)
comment = GenericForeignKey() # 等同于GenericForeignKey()
class Meta:
verbose_name = "评论"
verbose_name_plural = verbose_name
ordering = ['-created_at'] # 指明默认排序
# SQL优化
index_together = ('content_type', 'object_id') # 联合唯一索引
def __str__(self):
return self.content
注意
对此表的两个关联user的字段必须写related_name。
因为,user表反向解析comment_set字段时,指向的不是唯一的外键关联,所以用related_name来区分。
网友评论