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):
    """
    用户信息表
    """
    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

原文地址:https://www.cnblogs.com/ManyQian/p/9271324.html

时间: 2024-08-17 10:33:44

python3进阶开发-第一个仿博客园的项目(1)的相关文章

仿博客园编辑器的插入代码 代码高亮功能

代码下载地址:http://download.csdn.net/detail/dfg727/7616305 1. a.配置tinymce,增加一个insert code按钮    b.处理显示页面中展开收缩的高亮部分事件 var tinymce_config = function (selector) { tinymce.init({ selector: selector, theme: "modern", menubar: false, plugins: [ "previe

BBS(仿博客园系统)项目05(后台管理功能实现:文章添加、富文本编辑器使用、xss攻击、BeautifulSoup4模块、富文本编辑器上传图片、修改头像)

摘要 布局框架搭建 随笔添加 后台管理富文本编辑器KindEditor xss攻击 文章简介的截取,BeautifulSoup4模块 富文本编辑器上传图片 头像修改 一.后台管理框架布局搭建 后台管理布局框架分析:导航条.左侧功能区.右侧主要功能显示和实现区 实现: 导航条:使用bootstrap模板:JavaScript>>导航条 左侧:使用bootstrap模板:组件>>列表组 右侧:使用bootstrap模板:JavaScript>>标签页 新建后台管理路由(注意

[cnblogs] 仿博客园插入代码的Windows Live Writer插件

一  插件相关效果图展示 插件效果图: 在Windows Live Writer中的效果如图: [1] [2] [3] 对应的插入代码在博客中的效果如下: [1] public static void Main(string[] args) { int sum = 0; for(int i = 0 ; i < 100 ; i++) { sum += i; } } [2] public static void Main(string[] args) { int sum = 0; for(int i

博客园&amp;华为云百万代金券福利

跟华为云的合作达成以后,我们积极沟通为园友们争取到了第一个福利,就是百万华为云代金券.每个通过博客园注册关联华为云的用户(也可扫下面的二维码关联),都可以收到价值100元的华为云体验券一张.实际付费超过1元后,我们会再次追加100元体验券.代金券可用于华为云官网160多种产品,即刻体验个人网站建设.开发环境部署.微信公众号后台搭建等多种实践场景吧. 代金券使用限制:代金券不可用于购买特惠产品:不可用于支付包年/多年订单.您可以选择最长9个月的包月和按需服务. 为什么是华为云? 之前的帖子里,有人

十年,站酷已成设计论坛霸主,博客园却成无兵之将

他山之石--邂逅站酷 虽然才毕业一年,似乎在很多人眼里这年龄只是个小屁孩的角色.但不知不觉,已经离刚上大学的时候有五年之多了,那时候因为专业的原因还是个美工,边学边做在社团组织里捣鼓一些海报和宣传视频.经同学推荐,有个叫做站酷的网站,好多高质量素材,矢量图任意缩放,不是有些图库的那些半模糊还有水印的战五渣,你懂的.后来因为感觉天份的原因,也没有什么美术功底,就放弃了继续设计师这一类行业.但是身边很多朋友都在做设计,江湖一直都在,站酷的名字从未停息. 他最近出了个叫做"高高手"的在线教育

做客博客园

啦啦啦!!! 第一天做客博客园,往日总是找各种资料在博客园,今日小菇凉我也来博客园留下"爪爪",造福自己与后人. 想要写博客的原因很简单,只为记录自己的菜鸟历程,往后回顾. 想要记录"坑"点的原因很简单,只为往后不再入坑. 想要记录学习日记的原因很简单,只为像蜗牛一样一步一步往上爬. 来博客园的目的很简单,只为大佬带起飞. 欢迎日后"看官"常来,帮到"看官",足以. 原文地址:https://www.cnblogs.com/a

关于博客园创始人的心路历程,启发很大!

文章转自:https://www.cnblogs.com/yesihoang/p/4566471.html 本期人物简介:dudu 1997年毕业于南京电力高等专科学校,对计算机技术有一种执着的兴趣与热情,喜欢挑战性,喜欢为了自己的目标去努力,.NET技术的坚定支持者,博客园的创建者和维护者. 我见过很多技术类个人网站,以前的Visual Basic技术网站.Visual C++技术网站.现在的.net和Java网站,他们有一个共同特点就是在开始的时候红红火火,1-2年后就逐渐消亡,很难作大,很

使用jquery moblie框架搭建一个手机版博客园

声明 本例仅供学习交流使用,不参与任何商业活动. 前言 本例结合我的前两篇博客 使用node.js爬取博客园首页的博客 和 使用原生node.js搭建HTTP服务器,支持MP4视频.图片传输,支持下载rar文件,使用jquery moblie框架搭建了一个简单的手机版博客园. 项目地址为手机版博客园http://blog.mdzz.tv:1011/,二维码和效果图如下,第一次加载可能有点慢. 服务器端输出日志如下: 源码我放在github上了,地址https://github.com/guass

python学习第一弹:爬虫(抓取博客园新闻)

前言 说到python,对它有点耳闻的人,第一反应可能都是爬虫~ 这两天看了点python的皮毛知识,忍不住想写一个简单的爬虫练练手,JUST DO IT 准备工作 要制作数据抓取的爬虫,对请求的源页面结构需要有特定分析,只有分析正确了,才能更好更快的爬到我们想要的内容. 打开博客园任何一个新闻页面,比如https://news.cnblogs.com/n/570973/,思路是通过这个源页面,并且根据页面中的“上一篇”.“下一篇”等链接,源源不断的爬取其它新闻内容. 浏览器访问https://