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)

 

 

 
        

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM