zoukankan      html  css  js  c++  java
  • BBS项目需求分析及表格创建

    1.项目需求分析

    1.登陆功能(基于ajax,图片验证码)

    2.注册功能(基于ajax,基于forms验证)

    3.博客首页

    4.个人站点

    5.文章详情

    6.点赞,点踩

    7.评论

      --根评论

      --子评论

    8.后台管理

      --文章展示

      --新增文章

    9.发布文章

    二.项目表格创建

    1.需要创建的表格

    用户信息表 ------UserInfo

    个人站点表-------Blog

    分类表  -------Category

    标签表    --------Tag

    文章表  --------Article

    文章和标签之间的第三张表,也可自己创建  ------Article2Tag

    点赞点踩表  ---ArticleUpDown

    文章评论表  ----Comment

    2.表格之间的关联关系

    UserInfo    一对一   Blog

    Blog     一对多    Category

    Blog     一对多 Tag

    Article  一对多    UserInfo

          一对多  Category

          多对多  Tag

    Article2Tag 一对多 Article

          一对多    Tag

    ArticleUpDown  一对多  UserInfo

            一对多  Article

    Comment  一对多   UserInfo

          一对多  Article

          自关联 ForeignKey对象是自己

    3.表格应有的字段

    UserInfo  nid   telephone  avatar  create_date  blog  其他的继承的AbstractUser自动帮忙创建

    Blog    nid  title  site_name  theme

    Category  nid  blog title

    Tag      nid  title  blog

    Article    nid  title  desc  content  create_date  comment_num  up_num  down_num  user category tag

    Article2Tag    nid  article  tag

    ArticleUpDown  nid  article  user  is_up

    Comment  nid  article  user  comm  create_date  parent_comment

    4.建表一些需要注意的点:-------这里只列出需要注意的点,原因在文件里都有备注。

    4.1 UserInfo表需要继承AbstractUser,为了应用auth。

    4.2 创建avatar字段调用FileField类,里面传入参数upload_to和default的意义。

    4.3 创建crete_date需要调用DateTimeField,里面需要传入auto_now_add的意义

    4.4 2.0版本级联删除的问题  on_delete = models.CASCADE

    4.5 CharField参数verbose_name的意思。

    4.6 外键to加引号和不加引号的区别

    4.7 创建文本内容字段需要用TextField

    4.8 两个表之间是多对多关系,第三张表可以自定义因为有时会有在第三张表添加新字段的需求。

    如果自定义第三张表需要在其中一个表参数里指定through和through_fields。

    最全BBS表格创建及涉及到的配置

    settings里涉及到创建表和初始数据库的配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'NAME': 'bbs2',
            'USER': 'root',
            'PASSWORD': '123'
        }
    # 这儿一定要写 ,找了半天才发现!!!必须在创建表之前写上,不然会报错。
    # 而且表格创建完成后再加上,makemigrations是不支持的
    AUTH_USER_MODEL='bbs.UserInfo'
    
    # 根路由,只有在模板里能用到 和media_url用法相似 开的url只是为了让django识别 名字可以随意命名
    # static_url映射static_root
    STATIC_URL = '/static/'
    # 创建多个app我们可能需要在不同app下创建static文件,如果几个app下需要用到同一个静态文件,就会出现浪费加载时间
    # 所以为了方便管理和提高加载效率,我们把一些常用的静态文件放在一个根路径下。STATICFILES_DIRS指定额外的静态文件
    # 存储位置
    # 别人不能直接访问静态文件 如果别人直接输入你的静态文件地址是不能访问的
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')
    ]

    models创建表

      1 from django.db import models
      2 from django.contrib.auth.models import AbstractUser
      3 
      4 
      5 # 自动创建的id,不知道能不能用to_field指定
      6 # 只要BBS上有的数据你都要存放到表里,对应到不同的表,做好关联。
      7 # Create your models here.
      8 # 这里要继承AbstractUser,应用auth模块。
      9 # id不需要手动去创建,orm会自动帮你创建
     10 class UserInfo(AbstractUser):
     11     id = models.AutoField(primary_key=True)
     12     # 这些创建表的类都是models里面封装好的,直接models.类名调用
     13     telephone = models.CharField(max_length=32)
     14     # FileField里面参数:verbose_name=None, name=None, upload_to='', storage=None, **kwargs
     15     # verbose_name的意思很简单,就是给你的模型类起一个更可读的名字,一般定义为中文
     16     # 文件流是不会放到数据库里面的,该字段在数据库中只存储路径,django提供了upload_to属性 ,
     17     # upload_to设定上传文件的存储目录和名称。初始默认路径下的设定图片
     18     avatar = models.FileField(upload_to='avatar/', default='avatar/default.png')
     19     # auto_now和auto_now_add。两者默认值都为False。auto_now = True 实例化字段会自动保存当前时间,无法手动添加非当前时间
     20     # auto_now_add 可以手动添加非当前时间
     21     create_date = models.DateTimeField(auto_now_add=True)
     22     blog = models.OneToOneField(to='Blog', to_field='id', null=True)
     23 
     24 
     25 # 其他的都要继承django预设的类models.Model
     26 class Blog(models.Model):
     27     id = models.AutoField(primary_key=True)
     28     title = models.CharField(max_length=32, verbose_name='博客标题')
     29     # 站点名称
     30     site_name = models.CharField(max_length=32, verbose_name='站点名称')
     31     # 博客主题样式
     32     theme = models.CharField(max_length=32, verbose_name='博客主题样式')
     33 
     34     def __str__(self):
     35         return self.title
     36 
     37 
     38 class Category(models.Model):
     39     id = models.AutoField(primary_key=True)
     40     title = models.CharField(max_length=32)
     41     # 软关联两张表,相当于只设置了逻辑上的关联db_constraint=False
     42     # db_constraint = False没有外键约束,有外键约束,是为了不写脏数据
     43     blog = models.ForeignKey(to='Blog', to_field='id', null=True)
     44 
     45     def str(self):
     46         return self.title
     47 
     48 
     49 class Tag(models.Model):
     50     id = models.AutoField(primary_key=True)
     51     # 标签名称
     52     title = models.CharField(max_length=32)
     53     # 所属博客
     54     blog = models.ForeignKey(to="Blog", to_field='id', null=True)
     55 
     56     def __str__(self):
     57         return self.title
     58 
     59 
     60 class Article(models.Model):
     61     id = models.AutoField(primary_key=True)
     62     # 文章标题
     63     title = models.CharField(max_length=32)
     64     # 文章摘要
     65     desc = models.CharField(max_length=255)
     66     # 存大文本 文章内容
     67     content = models.TextField()
     68     create_date = models.DateTimeField(auto_now_add=True)
     69     # 默认为0
     70     comment_num = models.IntegerField(default=0)
     71     up_num = models.IntegerField(default=0)
     72     down_num = models.IntegerField(default=0)
     73     user = models.ForeignKey(to='UserInfo', to_field='id', null=True)
     74     category = models.ForeignKey(to='Category', to_field='id', null=True)
     75     # 手动创建多对多的第三张表 为了方便添加一些字段
     76     # 通过through指定自己写的中间表
     77     tag = models.ManyToManyField(to='Tag', through='Article2Tag', through_fields=('article', 'tag'))
     78 
     79 
     80 # 自己创建中间表,add(),remove(),set()不能用了
     81 class Article2Tag(models.Model):
     82     id = models.AutoField(primary_key=True)
     83     # 文章id 外键关联 自动帮忙在字段后面加上id
     84     article = models.ForeignKey(to='Article', to_field='id', null=True)
     85     # 标签id
     86     tag = models.ForeignKey(to='Tag', to_field='id', null=True)
     87 
     88 
     89 class ArticleUpDown(models.Model):
     90     id = models.AutoField(primary_key=True)
     91     # 用户不能为空
     92     user = models.ForeignKey(to='UserInfo', to_field='id')
     93     # 点赞/点踩 的文章
     94     article = models.ForeignKey(to='Article', to_field='id', null=True)
     95     # 赞还是踩
     96     is_up = models.BooleanField(default=True)
     97 
     98 
     99 class Comment(models.Model):
    100     id = models.AutoField(primary_key=True)
    101     # 评论的用户
    102     user = models.ForeignKey(to='UserInfo', to_field='id')
    103     # 评论的文章
    104     article = models.ForeignKey(to='Article', to_field='id')
    105     # 评论的内容
    106     comm = models.CharField(max_length=255)
    107     # 评论的时间
    108     create_date = models.DateTimeField(auto_now_add=True)
    109     # 两种写法 to = 'self'
    110     # parent_comment=models.ForeignKey(to='Comment',to_field='nid')
    111     # 父评论的id,自关联,防止写脏数据
    112     parent_comment = models.ForeignKey(to='self', to_field='id', null=True)
    
    

     

  • 相关阅读:
    [C++] Class (part 2)
    [C++] Class (part 1)
    [c++] Inline Function
    [C++] in-class initializer
    简易线程池Thread Pool
    js里function的apply vs. bind vs. call
    webix custom component-九宫格
    webix源码阅读
    比特币的原理+问题
    wpf中UserControl的几种绑定方式
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9681613.html
Copyright © 2011-2022 走看看