一、前期準備 1.新建一個django項目 2.連接mysql資料庫(註意需要在init文件裡面書寫import pymysql),告訴django使用pymysql連接資料庫 3.靜態文件路徑在settings里配置一下,並且在項目文件夾下新建一個靜態文件夾 二、bbs項目表設計 做一個項目最首要 ...
一、前期準備
1.新建一個django項目
2.連接mysql資料庫(註意需要在init文件裡面書寫import pymysql),告訴django使用pymysql連接資料庫
3.靜態文件路徑在settings里配置一下,並且在項目文件夾下新建一個靜態文件夾
二、bbs項目表設計
做一個項目最首要的表的設計,一個表設計不好,後續開發的地基就不牢!
"""
1.用戶表:要繼承AbstractUser類
擴展欄位:
phone:用戶電話
avatar:用戶頭像
create_time:創建時間
2.個人站點表:用戶輸入什麼url就跳轉到對應的站點
欄位:
site_name:站點名稱
site_title:站點標題
site_theme:站點主題
3.文章表:
欄位:
title:文章標題
desc:文章簡介
content:文章內容
create_time:發佈時間
下述三個欄位雖然可以從其他表中獲取,但是頻繁的跨表查詢效率較低,
可以直接在文章表裡設計該欄位,點贊數+1時只要同步給文章表裡的該欄位+1就行!(資料庫欄位優化)
up_num:點贊數
down_num:點踩數
comment_num:評論數
4.文章分類表:
欄位:
name:分類名
5.文章標簽表:
欄位:
name:標簽名
6.點贊點踩表:記錄了哪個用戶給哪個文章點贊還是點踩
欄位:
user:用戶主鍵值 ForeignKey(to='UserInfo')
article:文章主鍵值 ForeignKey(to='Article')
is_up:是否點贊(布爾值欄位類型)
is_down:是否點踩(布爾值欄位類型)
7.評論表:記錄哪個用戶給哪個文章評論了什麼內容
欄位:
user:用戶 ForeignKey(to='UserInfo')
article:文章 ForeignKey(to='Article')
content:評論內容
comment_time:評論時間
# 評論內容有跟評論和子評論的區別,跟評論是直接評論文章的,子評論是評論跟評論的
parent:自關聯 ForeignKey(to='Comment',null=True) to裡面也可以寫成self表示自己關聯自己
"""
七張表之間的關係
1.用戶表和個人站點表:一對一關係,外鍵建在用戶表
2.個人站點表和文章標簽表:一對多關係,外鍵建在文章標簽表
3.個人站點表和文章分類 表:一對多關係,外鍵建在文章分類表
4.個人站點和文章表:一對多關係,外鍵建在文章表
5.文章表和文章標簽表:多對多關係,外鍵建在文章表
6.文章表和文章分類表:一對多關係,外鍵建在文章分類表
接下來,我們就可以在models.py里創建對應的表了!
bbs項目表創建源碼
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
# 1、用戶表:繼承AbstractUser類,需要先導入這個類
class UserInfo(AbstractUser):
phone = models.BigIntegerField(verbose_name='電話',null=True)
avatar = models.FileField(upload_to='avatar/',default='avatar/default.png',verbose_name='頭像')
"""
給avatar欄位傳文件對象,該文件會自動保存到upload_to='avatar/'指定的文件夾下,這個文件夾需要自己在項目文件夾下創建
資料庫里的avatar欄位只保存文件路徑,同時可以設置一個預設頭像
"""
create_time = models.DateTimeField(auto_now_add=True,verbose_name='創建時間')
# 用戶表與個人站點表一對一關係,外鍵建在用戶表
blog = models.OneToOneField(to='Blog',on_delete=models.CASCADE,null=True)
# 2、個人站點表
class Blog(models.Model):
site_name = models.CharField(verbose_name='站點名稱',max_length=64)
site_title = models.CharField(verbose_name='站點標題',max_length=64)
site_theme = models.CharField(verbose_name='站點主題',max_length=256) # 存的是css、js樣式的路徑
# 3、文章表
class Article(models.Model):
title = models.CharField(verbose_name='文章標題',max_length=64)
desc = models.CharField(verbose_name='文章摘要',max_length=256)
content = models.TextField(verbose_name='文章內容')
create_time = models.DateTimeField(verbose_name='創建時間',auto_now_add=True)
# 資料庫欄位設計優化
up_num = models.IntegerField(verbose_name='點贊數',default=0)
down_num = models.IntegerField(verbose_name='點踩數',default=0)
comment_num = models.IntegerField(verbose_name='評論數',default=0)
# 個人站點表和文章表一對多關係,外鍵建在文章表
blog = models.ForeignKey(to='Blog',on_delete=models.CASCADE,null=True)
# 文章表和文章分類表是一對多關係,外鍵建在文章表
category = models.ForeignKey(to='Category',null=True,on_delete=models.CASCADE)
# 多對多關係表的外鍵
tag = models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))
# 通過Article2Tag這個張表查article就把Article2Tag里的article欄位放前面
# 文章表和標簽表的多對多表創建,採用的是半自動的方式,利用擴展自動和查詢
class Article2Tag(models.Model):
article = models.ForeignKey(to='Article',null=True,on_delete=models.CASCADE)
tag = models.ForeignKey(to='Tag',null=True,on_delete=models.CASCADE)
# 4、文章分類表
class Category(models.Model):
name = models.CharField(verbose_name='分類名',max_length=32)
# 個人站點表和文章分類表是一對多關係,外鍵建在文章分類表
blog = models.ForeignKey(to='Blog',null=True,on_delete=models.CASCADE)
# 5、文章標簽表
class Tag(models.Model):
name = models.CharField(verbose_name='標簽名',max_length=32)
# 個人站點表和文章標簽表是一對多關係,外鍵建在文章標簽表
blog = models.ForeignKey(to='Blog',null=True,on_delete=models.CASCADE)
# 6、點贊點踩表
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()
is_down = models.BooleanField()
# 7、評論表
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=256)
create_time = models.DateTimeField(verbose_name='評論時間',auto_now_add=True)
# 子評論,自關聯
parent = models.ForeignKey(to='self',on_delete=models.CASCADE)