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 AbstractUserclass 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.usernameclass Meta:verbose_name = "用户信息"verbose_name_plural = verbose_nameclass 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.titleclass Meta:verbose_name = "博客"verbose_name_plural = verbose_nameclass 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_nameclass 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.titleclass Meta:verbose_name = "标签"verbose_name_plural = verbose_nameclass 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.titleclass Meta:verbose_name = "文章"verbose_name_plural = verbose_nameclass 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_nameclass 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_nameclass 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_nameclass 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.contentclass Meta:verbose_name = "评论"verbose_name_plural = verbose_name

 

转载于:https://www.cnblogs.com/ManyQian/p/9271324.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 安装nodejs_阿里开源——用于前端和nodejs的轻量级任务管理和构建工具Dawn

介绍Dawn 取「黎明、破晓」之意,原为「阿里云业务运营团队」内部的前端构建和工程化工具,现已完全开源。它通过 pipeline 和 middleware 将开发过程抽象为相对固定的阶段和有限的操作,简化并统一了开发人员的日常构建与开发相关的工作。Githu…

华为pap和chap的配置。

PAP 验证举例 1. 组网需求 如图1-2所示,路由器Quidway1 和Quidway2 之间用接口Serial3/0/0 互连,要求路 由器Quidway1 用PAP方式验证路由器Quidway2。 3. 配置步骤 (1) 配置路由器Quidway1: [Quidway]aaa [Quidway-aaa]local-user quidway2 p…

Linux C简单的web服务器

Linux C简单的web服务器 目录 Linux C简单的web服务器 一、基础类型重命名 二、包裹函数(wrap.h/wrap.c 主要是网络通讯和多线程的包裹函数) 三、服务端程序(web_server.h/web_server.c)—— 使用EPOLL高并发机制 四、HTTP解…

.NET面试题系列(七)IIS

应用程序池的集成模式和经典模式的区别 应用程序池模式会影响服务器处理托管代码请求的方式。 如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求。 如果托管应用程序在采用经典模式的应用程序池中运行&…

大学城美好生活组图

离开学校一段时间了,但这里还有很好的回忆................... 以下是广州大学城分享的点点滴滴,享受一下生活吧......................... 广州大学城,位于广州番禺区珠江出海口的江心岛上,与享誉中西方国家的、培育了大批国、共…

C语言设计模式——命令模式

C语言设计模式——命令模式 好处:让代码清晰明了,容易添加和删除,易维护。 哪些地方会用到命令模式?(列出几个常见的例子) 1、按键处理,每个按键按下得到一个索引(指的就是命令&am…

什么是音色?

要问最近最火的节目是什么?《浪姐》绝对可以冲击C位。要问最近最火的剧是哪部?有全中国小学生最近都怕的张东升老师那部前三甲无疑。要问最近最火的歌是哪首?《Mojito》或许是唯一的答案。这首极具拉丁风格的歌让周董再一次回答了“谁是周杰伦…

hive 语句总结_Hive常用命令总结

本文只是总结一些在Hive中常用的命令,并且假设需要的目录或者数据已经存在。创建表,\t作为列的分隔符create table trade_detail (id bigint,income double,expenses double,time string) row formate delimited fields terminated by \t;create table u…

php的用户认证(有点难度 多看几遍吧)

采用PHP的用户认证如果你希望在每一个脚本的基础上实现口令保护功能,那么你可以联合使用header()函数和$PHP_AUTH_USER、$PHP_AUTH_PW全局变量来创造一个基本的认证方案。通常的、基于服务器的认证请求/响应回合很象下面这个样子:1.用户向一台Web服务器请…

爱了雷布斯

本来今天想写个NTP的文章,但是因为小米昨天的这个操作一直想夸一下,所以写写雷布斯,吹吹雷布斯。我是米粉,肯定是米粉,前段时间还有读者来问我,现在能不能入手小米的股票,这个我不敢给建议&…

python爬取企业电话_Python爬取天眼查企业数据

作者本机环境:系统-windows10编程语言-PythonPython版本-Python3.6.8解析工具-Xpath(解析工具不唯一,均可,这里只演示xpath)编写工具-Pycharm本内容使用Python语言进行编写,而Python也是编写爬虫比较好的一款编程语言,…

开发常用工具

开发常用工具 宗旨:技术的学习是有限的,分享的精神是无限的。一、编辑器 1、Notepad:意外关闭此软件文件不会丢失; 2、PSPad:保持上一次编辑状态,这样在你下次打开编辑器的时候可以直接显示原来的文件。此…

oracle 12.2.0.1 搭建 active dataguard

os: centos 7.4 database:12.2.0.1 dbf 本次是以 oracle database 12.2.0.1 dbf 的形式部署的,后面会记录 rac asm 的形式。 任何时候都要说下三种模式: 最大保护:maximize protection 最高性能:maximize perform…

运行地址与加载地址估计大部分人没弄明白~

本文为【单片机步入嵌入式Linux】系列文章的第二篇,主要是跟大家讲解一下链接过程中几个地址的区分与理解~1 单片机存储分配在玩单片机(以stm32为例)的时候会有RAM空间和ROM空间,RAM空间主要是用于数据的访问,而ROM空间用于存放烧录的固件&am…

foxpro:将表写入excel

oleApp CREATEOBJECT("Excel.Application")oleapp.workbooks.addoleapp.visible.t.SELECT ls*写入表的标题oleapp.cells(1,10).value"这是我的表"*oleapp.cells(1,10).font.fontname"黑体"oleapp.cells(1,10).font.size24nfieldcountAFIELDS(al…

adb打开网页_android 使用指定浏览器打开网页

梳理下流程:枚举对应浏览器包名到数组中数组循环根据包名找到对应的LaunchIntent通过LaunchIntent找到对应的LaunchActivity的包名Intent通过设置activity的包名类名/*** 工具类*/public class CheckApkExist {private static String ucPkgName "com.uc.brows…

博客目录列表(C与Linux部分)

一、C语言 1、C语言——关键字 2、C语言——位操作 3、C语言——数组、函数、指针 4、C语言——结构体 5、C语言——预编译 6、C语言——宏定义 7、C语言——字符串函数 8、C语言——可变参数 9、C语言——回调函数 10、数据结构——链表 11、数据结构——堆栈 12、数据结构——…

python-greenlet模块(协程)

12345678910111213141516from greenlet import greenletdef test1():print(12)gr2.switch()print(34)gr2.switch()def test2():print(56)gr1.switch()print(78)gr1 greenlet(test1)#启动一个协程gr2 greenlet(test2)#启动一个协程gr1.switch()#switch是协程切换高并发&#x…

我妈在深圳的这些日子

今天送了我丈母娘回家,平时在家里,我会叫妈。下面文章中写到的我爸、我妈、指的是我老丈人和丈母娘。上个周末,我跟我妈说,谢谢你过来帮忙我们照顾楠哥,辛苦你了。我说了两遍,可能她听的不是很清楚&#xf…

2010-04-25 搞定aftr

今天终于完全地把aftr给搞定了。 刚开始的时候,建了三台机器,甲,乙,丙,甲和乙通过ipv6相连,甲的ipv6地址为2001:0:0:1::2/64,乙的ipv6地址为2001:0:0:1::1/64,乙和丙通过ipv4相连&am…