美文网首页
模型类中同时关联同一张表

模型类中同时关联同一张表

作者: mutang | 来源:发表于2021-10-03 23:48 被阅读0次

@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来区分。

相关文章

网友评论

      本文标题:模型类中同时关联同一张表

      本文链接:https://www.haomeiwen.com/subject/tstinltx.html