1. 程式人生 > >第4章 需求分析和model設計

第4章 需求分析和model設計

本章主要內容:

  • django app的設計
  • 各個app models的設計
  • 資料表生成與修改

django app的設計

這裡寫圖片描述

安裝環境python27下

  • 建立虛擬環境
mkvirtualenv mxonline
pip install django==1.9.8
pip install mysql-python
  • 配置settings中的DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'mxonline'
, 'USER':'mxonline', 'PASSWORD':'mxonline', 'HOST':"127.0.0.1" } }
  • 遷移資料庫
python manage.py makemigrations
python manage.py migrate
  • 訪問

設計USER APP的model

  • 新建users app,然後設計user類
  • 由於django自帶的user類的欄位不能滿足我們的需求,所以需要擴充套件
  • 擴充套件django user的方法有幾種:

    • 繼承AbstractUser
    • 新建類profile然後用外來鍵指向user
  • 這裡使用繼承AbstractUser的方法擴充套件

from django.db import models
from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name=u"暱稱", default="")
    birday = models.DateField(verbose_name=u"生日", null=True, blank=True)
    gender = models.CharField(max_length=6
, choices=(("male",u"男"),("female","女")), default="female") address = models.CharField(max_length=100, default=u"") mobile = models.CharField(max_length=11, null=True, blank=True) image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png", max_length=100) class Meta: verbose_name = "使用者資訊" verbose_name_plural = verbose_name def __unicode__(self): return self.username
  • 註冊在settings中APP,並且需要為AUTH_USER_MODEL賦值
AUTH_USER_MODEL="users.UserProfile"

各個app models的設計

  • 可能出現的問題
    這裡寫圖片描述

  • 解決該問題的方法主要是:分層設計

  • 把使用者的操作(評論,收藏等)獨立出來,放到另一個單獨的app中

這裡寫圖片描述

  • users中新增另外兩個比較獨立的model:驗證碼和輪播圖
    這裡寫圖片描述

  • 郵箱驗證碼

class EmailVerifyRecord(models.Model):
    code = models.CharField(max_length=20, verbose_name=u"驗證碼")
    email = models.EmailField(max_length=50, verbose_name=u"郵箱")
    send_type = models.CharField(verbose_name=u"驗證碼型別", choices=(("register",u"註冊"),("forget",u"找回密碼"), ("update_email",u"修改郵箱")), max_length=30)
    send_time = models.DateTimeField(verbose_name=u"傳送時間", default=datetime.now)

    class Meta:
        verbose_name = u"郵箱驗證碼"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return '{0}({1})'.format(self.code, self.email)
  • 輪播圖
class Banner(models.Model):
    title = models.CharField(max_length=100, verbose_name=u"標題")
    image = models.ImageField(upload_to="banner/%Y/%m", verbose_name=u"輪播圖", max_length=100)
    url = models.URLField(max_length=200, verbose_name=u"訪問地址")
    index = models.IntegerField(default=100, verbose_name=u"順序")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"輪播圖"
        verbose_name_plural = verbose_name

設計課程的app

startapp courses
  • 觀察介面

這裡寫圖片描述

  • 設計資料庫表

這裡寫圖片描述

class Course(models.Model):
    name = models.CharField(max_length=50, verbose_name=u"課程名")
    desc = models.CharField(max_length=300, verbose_name=u"課程描述")
    detail = UEditorField(verbose_name=u"課程詳情",width=600, height=300, imagePath="courses/ueditor/",filePath="courses/ueditor/", default='')
    is_banner = models.BooleanField(default=False, verbose_name=u"是否輪播")
    degree = models.CharField(verbose_name=u"難度", choices=(("cj","初級"), ("zj","中級"), ("gj","高階")), max_length=2)
    learn_times = models.IntegerField(default=0, verbose_name=u"學習時長(分鐘數)")
    students = models.IntegerField(default=0, verbose_name=u'學習人數')
    fav_nums = models.IntegerField(default=0, verbose_name=u'收藏人數')
    image = models.ImageField(upload_to="courses/%Y/%m", verbose_name=u"封面圖", max_length=100)
    click_nums = models.IntegerField(default=0, verbose_name=u"點選數")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"課程"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name
  • Lesson 章節
class Lesson(models.Model):
    course = models.ForeignKey(Course, verbose_name=u"課程")
    name = models.CharField(max_length=100, verbose_name=u"章節名")
    learn_times = models.IntegerField(default=0, verbose_name=u"學習時長(分鐘數)")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"章節"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name
  • Video 視訊
class Video(models.Model):
    lesson = models.ForeignKey(Lesson, verbose_name=u"章節")
    name = models.CharField(max_length=100, verbose_name=u"視訊名")
    learn_times = models.IntegerField(default=0, verbose_name=u"學習時長(分鐘數)")
    url = models.CharField(max_length=200, default="", verbose_name=u"訪問地址")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"視訊"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name
  • CourseResource 課程資源
class CourseResource(models.Model):
    course = models.ForeignKey(Course, verbose_name=u"課程")
    name = models.CharField(max_length=100, verbose_name=u"名稱")
    download = models.FileField(upload_to="course/resource/%Y/%m", verbose_name=u"資原始檔", max_length=100)
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"課程資源"
        verbose_name_plural = verbose_name

organization的設計

python manage.py startapp  organization
  • 觀察介面

這裡寫圖片描述

  • models設計

這裡寫圖片描述

  • 城市資訊 和 課程機構資訊
class CityDict(models.Model):
    name = models.CharField(max_length=20, verbose_name=u"城市")
    desc = models.CharField(max_length=200, verbose_name=u"描述")
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = u"城市"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name



class CourseOrg(models.Model):
    name = models.CharField(max_length=50, verbose_name=u"機構名稱")
    desc = UEditorField(verbose_name=u"機構描述",width=900, height=300, imagePath="org/ueditor/",
                                         filePath="org/ueditor/", default='')
    tag = models.CharField(default="全國知名", max_length=10, verbose_name=u"機構標籤")
    category = models.CharField(default="pxjg", verbose_name=u"機構類別", max_length=20, choices=(("pxjg","培訓機構"),("gr","個人"),("gx","高校")))
    click_nums = models.IntegerField(default=0, verbose_name=u"點選數")
    fav_nums = models.IntegerField(default=0, verbose_name=u"收藏數")
    image = models.ImageField(upload_to="org/%Y/%m", verbose_name=u"logo", max_length=100)
    address = models.CharField(max_length=150, verbose_name=u"機構地址")
    city = models.ForeignKey(CityDict, verbose_name=u"所在城市")
    students = models.IntegerField(default=0, verbose_name=u"學習人數")
    course_nums = models.IntegerField(default=0, verbose_name=u"課程數")
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = u"課程機構"
        verbose_name_plural = verbose_name
  • 講師
class Teacher(models.Model):
    org = models.ForeignKey(CourseOrg, verbose_name=u"所屬機構")
    name = models.CharField(max_length=50, verbose_name=u"教師名")
    work_years = models.IntegerField(default=0, verbose_name=u"工作年限")
    work_company = models.CharField(max_length=50, verbose_name=u"就職公司")
    work_position = models.CharField(max_length=50, verbose_name=u"公司職位")
    points = models.CharField(max_length=50, verbose_name=u"教學特點")
    click_nums = models.IntegerField(default=0, verbose_name=u"點選數")
    fav_nums = models.IntegerField(default=0, verbose_name=u"收藏數")
    age = models.IntegerField(default=18, verbose_name=u"年齡")
    image = models.ImageField(default='', upload_to="teacher/%Y/%m", verbose_name=u"頭像", max_length=100)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = u"教師"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name

    def get_course_nums(self):
        return self.course_set.all().count()

使用者操作operation的model設計

這裡寫圖片描述

  • 程式碼
# _*_ encoding:utf-8 _*_
from __future__ import unicode_literals

from datetime import datetime

from django.db import models

from users.models import UserProfile
from courses.models import Course


class UserAsk(models.Model):
    name = models.CharField(max_length=20, verbose_name=u"姓名")
    mobile = models.CharField(max_length=11, verbose_name=u"手機")
    course_name = models.CharField(max_length=50, verbose_name=u"課程名")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"使用者諮詢"
        verbose_name_plural = verbose_name


class CourseComments(models.Model):
    "課程評論"
    user = models.ForeignKey(UserProfile, verbose_name=u"使用者")
    course = models.ForeignKey(Course, verbose_name=u"課程")
    comments = models.CharField(max_length=200, verbose_name=u"評論")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"課程評論"
        verbose_name_plural = verbose_name


class UserFavorite(models.Model):
    user = models.ForeignKey(UserProfile, verbose_name=u"使用者")
    fav_id = models.IntegerField(default=0, verbose_name=u"資料id")
    fav_type = models.IntegerField(choices=((1,"課程"),(2,"課程機構"),(3,"講師")), default=1, verbose_name=u"收藏型別")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"使用者收藏"
        verbose_name_plural = verbose_name


class UserMessage(models.Model):
    user = models.IntegerField(default=0, verbose_name=u"接收使用者")
    message = models.CharField(max_length=500, verbose_name=u"訊息內容")
    has_read = models.BooleanField(default=False, verbose_name=u"是否已讀")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"使用者訊息"
        verbose_name_plural = verbose_name


class UserCourse(models.Model):
    user = models.ForeignKey(UserProfile, verbose_name=u"使用者")
    course = models.ForeignKey(Course, verbose_name=u"課程")
    add_time = models.DateTimeField(default=datetime.now, verbose_name=u"新增時間")

    class Meta:
        verbose_name = u"使用者課程"
        verbose_name_plural = verbose_name
  • 將所有的app都移動到apps目錄下,其他地方和索引不要改變,此時需要在settings下配置apps的路徑
import sys

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

總結本章主要內容

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述