from django.db import models


# Create your models here.


from django.contrib.auth.models import User, AbstractUser



class UserInfo(AbstractUser):

    '''用户信息'''

    nid = models.AutoField(primary_key=True)

    telephone = models.CharField(max_length=11, null=True, unique=True)

    avatar = models.FileField(upload_to='avatar/', default='/avatars/default.png')

    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    '''

    DateField和DateTimeField,后者有时分秒

    auto_now_add:配置auto_now_add,创建数据记录的时候会把当前时间添加到数据库

    auto_now:配置auto _now,每次更新数据记录的时候会更新该字段

    '''

    blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE)


    def __str__(self):

        return self.username



class Blog(models.Model):

    '''

    博客信息表(站点表)


    '''

    nid = models.AutoField(primary_key=True)

    title = models.CharField(verbose_name='个人博客标题', max_length=64)

    site_name = models.CharField(verbose_name='站点名称', max_length=64)

    theme = models.CharField(verbose_name='博客主主题', max_length=32)


    def __str__(self):

        return self.title



class Category(models.Model):

    '''

    博主个人文章分类表

    '''

    nid = models.AutoField(primary_key=True)

    title = models.CharField(verbose_name='分类标题', max_length=32)

    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)


    def __str__(self):

        return self.title



class Tag(models.Model):

    '''

    博客标签表

    '''

    nid = models.AutoField(primary_key=True)

    title = models.CharField(verbose_name='标签名称', max_length=32)

    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)

    def __str__(self):

        return self.title



class Article(models.Model):

    nid=models.AutoField(primary_key=True)

    title=models.CharField(max_length=50,verbose_name='文章标题')

    desc=models.CharField(max_length=255,verbose_name='文章描述')

    create_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

    content=models.TextField()



    comment_count=models.IntegerField(default=0)

    up_count=models.IntegerField(default=0)

    down_count=models.IntegerField(default=0)



    user=models.ForeignKey(verbose_name='作者',to='UserInfo',to_field='nid',on_delete=models.CASCADE)

    category=models.ForeignKey(to='Category',to_field='nid',null=True,on_delete=models.CASCADE)

#需要手动创建多对多关系的第三张表

    tags=models.ManyToManyField(


        to='Tag',

        through='Article2Tag',

        through_fields=('article','tag'),

    )

    def __str__(self):

        return self.title



class Article2Tag(models.Model):

    nid=models.AutoField(primary_key=True)

    article=models.ForeignKey(verbose_name='文章',to='Article',to_field='nid',on_delete=models.CASCADE)

    tag=models.ForeignKey(verbose_name='标签',to='Tag',to_field='nid',on_delete=models.CASCADE)


    class Meta:

        unique_together=[

            ('article','tag')

        ]

    def __str__(self):

        v=self.article.title+'--------'+self.tag.title

        return v



class ArticleUpDown(models.Model):

    '''

    文章的点赞点踩表

    '''

    nid=models.AutoField(primary_key=True)

    user=models.ForeignKey(null=True,to="UserInfo",to_field='nid',on_delete=models.CASCADE)

    article=models.ForeignKey(null=True,to='Article',to_field='nid',on_delete=models.CASCADE)

    is_up=models.BooleanField(default=True)


    class Meta:

        unique_together=[

            ('article','user')

        ]




class Comment(models.Model):

    '''

    评论表

    '''


    nid=models.AutoField(primary_key=True)

    user=models.ForeignKey(verbose_name='评论者',to='UserInfo',to_field='nid',on_delete=models.CASCADE)

    article=models.ForeignKey(verbose_name='评论的文章',to='Article',to_field='nid',on_delete=models.CASCADE)

    create_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

    content=models.CharField(verbose_name='评论内容',max_length=255)

    parent_comment=models.ForeignKey('self',null=True,on_delete=models.CASCADE)


    def __str__(self):

        return self.content