• python3进阶开发-第一个仿博客园的项目(1)


    首先我们要设计一下表结构:

    UserInfo(用户信息表) --------》一对一    -----------》Blog(博客信息表)

    UserInfo(用户信息表) ---------》一对多    -----------》Article UpDown(点赞表)

    UserInfo(用户信息表) ---------》一对多    -----------》Article Comment(评论表)

    UserInfo(用户信息表)----------》一对多    -----------》Article(文章)

    Blog(博客信息表)    ----------------》 一对多   -----------》Category(个人博客文章分类表) 

    Blog(博客信息表)    ----------------》一对多   ------------》Tag(标签表)

    Category(个人博客文章分类表)--》 一对多 -------------》Article(文章表)

    Tag(标签表)  --------------------------》多对多  -------------》Article(文章表)

    Article(文章表) ------------------------》一对一  -------------》ArticleDetail(文章详情表)

    Article(文章表) ------------------------》一对多  --------------》Article UpDown(点赞表)

    Article(文章表) ------------------------》一对多 ---------------》Article Comment(评论表)

    from django.db import models
    
    # Create your models here.
    from django.contrib.auth.models import AbstractUser
    
    class UserInfo(AbstractUser):  #继承了Django框架自带的一张用户表,我们可以自定义原表没有的属性进行拓展
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)
        phone = models.CharField(max_length=11, null=True, unique=True)
        avatar = models.FileField(upload_to="avatars/", default="avatars/default.png")
    
        blog = models.OneToOneField(to="Blog", to_field="nid", null=True)
    
        def __str__(self):
            return self.username
    
        class Meta:
            verbose_name = "用户信息"
            verbose_name_plural = verbose_name
    
    
    class Blog(models.Model):
        """
        博客信息
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=64)  # 个人博客标题
        theme = models.CharField(max_length=32)  # 博客主题
    
        def __str__(self):
            return self.title
    
        class Meta:
            verbose_name = "博客"
            verbose_name_plural = verbose_name
    
    
    class Category(models.Model):
        """
        个人博客文章分类
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)  # 分类标题
        blog = models.ForeignKey(to="Blog", to_field="nid")  # 外键关联博客,一个博客站点可以有多个分类
    
        def __str__(self):
            return "{}-{}".format(self.blog.title, self.title)
    
        class Meta:
            verbose_name = "文章分类"
            verbose_name_plural = verbose_name
    
    
    class Tag(models.Model):
        """
        标签
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)  # 标签名
        blog = models.ForeignKey(to="Blog", to_field="nid")  # 所属博客
    
        def __str__(self):
            return self.title
    
        class Meta:
            verbose_name = "标签"
            verbose_name_plural = verbose_name
    
    
    class Article(models.Model):
        """
        文章
        """
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=50)  # 文章标题
        desc = models.CharField(max_length=255)  # 文章描述
        create_time = models.DateTimeField(auto_now_add=True)  # 创建时间
        category = models.ForeignKey(to="Category", to_field="nid", null=True)
    
        user = models.ForeignKey(to="UserInfo", to_field="nid")
    
        tags = models.ManyToManyField(
            to="Tag",
            through="Article2Tag",
            through_fields=("article", "tag"),
        )
    
        def __str__(self):
            return self.title
    
        class Meta:
            verbose_name = "文章"
            verbose_name_plural = verbose_name
    
    
    class ArticleDetail(models.Model):
        """
        文章详情表
        """
        nid = models.AutoField(primary_key=True)
        content = models.TextField()
        article = models.OneToOneField(to="Article", to_field="nid")
    
        class Meta:
            verbose_name = "文章详情"
            verbose_name_plural = verbose_name
    
    
    class Article2Tag(models.Model):
        """
        文章和标签的多对多关系表
        """
        nid = models.AutoField(primary_key=True)
        article = models.ForeignKey(to="Article", to_field="nid")
        tag = models.ForeignKey(to="Tag", to_field="nid")
    
        def __str__(self):
            return "{}-{}".format(self.article, self.tag)
    
        class Meta:
            unique_together = (("article", "tag"),)
            verbose_name = "文章-标签"
            verbose_name_plural = verbose_name
    
    
    class ArticleUpDown(models.Model):
        """
        点赞表
        """
        nid = models.AutoField(primary_key=True)
        user = models.ForeignKey(to="UserInfo", null=True)
        article = models.ForeignKey(to="Article", null=True)
        is_up = models.BooleanField(default=True)
    
        class Meta:
            unique_together = (("article", "user"),)
            verbose_name = "点赞"
            verbose_name_plural = verbose_name
    
    
    class Comment(models.Model):
        """
        评论表
        """
        nid = models.AutoField(primary_key=True)
        article = models.ForeignKey(to="Article", to_field="nid")
        user = models.ForeignKey(to="UserInfo", to_field="nid")
        content = models.CharField(max_length=255)  # 评论内容
        create_time = models.DateTimeField(auto_now_add=True)
        parent_comment = models.ForeignKey("self", null=True)
    
        def __str__(self):
            return self.content
    
        class Meta:
            verbose_name = "评论"
            verbose_name_plural = verbose_name
  • 相关阅读:
    Simple ASP.NET CORE 2.2 App +Vue JS
    Upload Image to .NET Core 2.1 API
    Nginx支持WebSocket服务
    DD打卡
    Asp.net Core 源码-PagedList<T>
    Asp.net Core 源码-UrlExtensions
    Asp.net Core 源码-SessionExtensions
    树莓派资源集合
    frp内网穿透
    Nuget包含cssjs等资源文件
  • 原文地址:https://www.cnblogs.com/ManyQian/p/9271324.html
Copyright © 2020-2023  润新知