Django的开发流程与数据库设计

引言:项目开发流程:
需求分析(成员:架构师 、产品经理 、开发者组长)
在跟客户谈需求之前,会大致先了解客户的需求,然后自己先设计一套比较好写的方案。跟客户沟通交流中引导客户往我们之前想好的方案上面靠,形成一个初步的方案

项目设计(成员:架构师选择项目的整体设计环境)

编程语言:Java、Python、PHP、C++等;
框架选择:Django、Flask、SpringMVC等
数据库选择
主体数据库:MySQL、SQL server、Oracle;
缓存数据库:redis/mongodb/memcacha;
功能划分:将整个项目划分成若干个功能模块
找开发组组长开会:给每个组分发任务
项目报价/预算
技术类需要多少人、多少天、开发的设备成本
产品经理层面:售后、客服
公司层面确认,产品经理去跟客户沟通。后续需要加功能,继续加钱。
分组开发:组长找组员开会,安排各自的功能模块
其实就是在架构师设计好的框架里面编写代码,在写代码的时候,写完需要自己先测试是否有bug。如果是一些显而易见的bug,你没有避免而是直接交给了测试部门测出来,那你可能就需要被扣绩效了(一定要跟测试组搞好关系);

测试:测试部门组织成员对模块、代码进行单元、功能、压力等测试。

交付上线

交给对方的运维人员;
直接上线到我们的服务器上并收取一定的维护费用;
一、数据库表的设计
一个项目中最重要的不是业务逻辑的书写,而是前期的表结构的设计,只有将表设计好了,后续的功能书写才能顺利完成。否则会重复修改表,既影响开发的效率,也会导致写好的业务代码无效。

  1. 用户表:继承AbstractUser

扩展字段:
phone:电话号码
avatar:用户头像
create_time:创建时间
外键字段:【一对一】个人站点表
2.个人站点表

业务字段:
site_name:站点名称
site_title 站点标题
site_theme 站点样式(存储一个CSS/JS文件)
3.文章标签表

业务字段:name 标签名

外键字段:【一对多】个人站点

4.文章类别表

业务字段:name 类别名
外键字段:【一对多】个人站点
5.文章表

业务字段:

title:文章标题
desc :文章简介/摘要
content:文章内容
create_time:发布时间
数据库字段设计优化:点赞数、点踩数、评论数(虽然这三个字段可以从其他表里面可以ORM跨表查询计算得出,但是频繁跨表效率降低)
5. up_num:点赞数
6. down_num:点踩数
7. comment_num:评论数

外键字段:

【一对多】个人站点
【多对多】文章标签表
【一对多】文章分类
6.点赞点踩表:用来记录哪个用户给哪篇文章点了赞还是点了踩(多对多关联表)

业务字段:
user(用户的主键)
article(文章的主键)
is_up(普通字段 BooleanFied)
7.文章评论表[comment]:用来记录哪个用户给哪篇文章写了哪些评论内容

业务字段:
user(用户的主键)
article(文章的主键)
content:CharField()
comment_time:DateField()
自关联parent ForeignKey(to=‘Comment’,null=True),ORM专门提供的自关联写法parent ForeignKey(to=‘self’,null=True)
注:根评论、子评论的概念:根评论就是直接评论当前发布的内容的,子评论是评论别人的评论。

根评论与子评论是一对多的关系

二、数据库表创建及同步
由于django自带的sqlite数据库对日期不敏感,所以我们换成MySQL

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
"""
    先写普通字段,之后在写外键字段
"""
class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name='手机号',null=True)
    # 用户头像,用户不选头像则用默认头像
    avatar = models.FileField(upload_to='avatar/',default='avatar/default.png')
    """
        给avatar字段传文件对象,该文件会自动存储到avatar文件下
        然后该字段只保存文件路径avatar/default.png
    """
    create_time = models.DateField(auto_now_add=True)

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

class Blog(models.Model):
    site_name = models.CharField(verbose_name="站点名称",max_length=32)
    site_title = models.CharField(verbose_name="站点标题",max_length=32)
    # 简单模拟,认识样式内部原理的操作
    site_theme = models.CharField(verbose_name="站点样式",max_length=64)
    # 存储用户自定义的css/js文件

class Category(models.Model):
    name = models.CharField(verbose_name='文章分类',max_length=32)
    blog = models.ForeignKey(to='Blog',null=True,on_delete = models.CASCADE)

class Tag(models.Model):
    name = models.CharField(verbose_name='文章标签',max_length=32)
    blog = models.ForeignKey(to='Blog', null=True,on_delete = models.CASCADE)

class Article(models.Model):
    title = models.CharField(verbose_name='文章标题',max_length=64)
    desc = models.CharField(verbose_name='文章摘要',max_length=255)
    # 文章内容有很多,一般情况下都是使用TextField
    content = models.TextField(verbose_name='文章内容')
    create_time = models.DateField(auto_now_add=True)

    # 数据库字段设计优化
    up_num = models.BigIntegerField(verbose_name='点赞数',default=0)
    down_num = models.BigIntegerField(verbose_name='点踩数',default=0)
    comment_num = models.BigIntegerField(verbose_name='评论数',default=0)
    # 外键字段
    blog = models.OneToOneField(to='Blog', null=True,on_delete = models.CASCADE)
    category = models.ForeignKey(to='Category', null=True,on_delete = models.CASCADE)
    tags = models.ManyToManyField(to='Tag',
                                  through='Article2Tag',
                                  through_fields=('article','tag')
                                 )

class Article2Tag(models.Model):
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    tag = models.ForeignKey(to='Tag',on_delete = models.CASCADE)

class UpAndDown(models.Model):
    user = models.ForeignKey(to='UserInfo',on_delete = models.CASCADE)
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    is_up = models.BooleanField()  # 传入布尔值,存0/1

class Comment(models.Model):
    user = models.ForeignKey(to='UserInfo',on_delete = models.CASCADE)
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    content = models.CharField(verbose_name='评论内容',max_length=255)
    comment_time = models.DateTimeField(verbose_name='评论时间',auto_now_add=True)
    # 自关联
    parent = models.ForeignKey(to='self',null=True,on_delete = models.CASCADE)
    # 有些评论就是根评论

BBS是一个前后端不分离的全栈个人博客项目,前端和python基础教程后端都需要自己一步步的完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值