天天看点

Django实战1-创建项目、表设计

创建项目与app

首先在django中创建一个叫zkonline的项目,创建一个叫zxonline的数据库。

**创建packages:apps、static、media,分别用来存放各应用,css数据等,媒体资源

Django实战1-创建项目、表设计

创建requirements.txt,在里面注明项目运行的环境。

查看版本可使用以下命令:

查看django版本:python -m django --version
查看python版本:python
查看mysql版本:mysql -u<username> -p<password> 
           

<username><password>

里写入你的mysql用户名与密码

/requirements.txt/

django2.2

pythonPython 3.8.3

mysql== 5.7.27 MySQL Community Server (GPL)

修改默认的setting:

将默认的数据库改为Mysql,NAME改为你创建的数据库的名字

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zkonline',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
    }
}

           

更改时区与语言,并将USE_TZ改为False

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False
           

声明static的路径:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

           

再创建三个app:users,courses,oprations,并配置到setting当中去

Django实战1-创建项目、表设计
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.users.apps.UsersConfig',
    'apps.courses.apps.CoursesConfig',
    'apps.operations.apps.OperationsConfig',
]
           

完成后,启动项目进入127.0.0.1:8000查看是否能够正确运行。

Django实战1-创建项目、表设计

创建用户表覆盖自带用户表

django自带有auth_user表,因此我们可以用重载的方式来添加我们自己的字段

Django实战1-创建项目、表设计

首先在apps/users/models.py中

from django.contrib.auth.models import AbstractUser
           

重载如下:

class UserProfile(AbstractUser):
    gender_choices = (('male', '男'),
                      ('female', '女'))
    real_name = models.CharField(max_length=50, verbose_name='真实姓名', default='')
    # 注册的时候不需要填入真实姓名,在上课时,老师可以让学生输入自己的真实姓名以帮助管理,故可以为空
    mobile_number = models.CharField(max_length=11, null=False, unique=True, verbose_name='手机号码')
    # 必须填入手机号,不能为空,不可重复
    gender = models.CharField(verbose_name='性别', choices=gender_choices, max_length=6)
    profile = models.ImageField(upload_to='profile_img/%Y/%m', default='/profile_img/default_profile.png')

    # 头像, 自动上传到profile_img当中, 默认头像为media/profile_img/default_profile.png

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = '用户信息'

    def __str__(self):
        if self.real_name:
            return self.real_name
        else:
            return self.username

           

在setting中添加一句:

注意不要写成

因为django已经注册了users这个app。

完成后进行

makemigrations migrate

关于循环引用

A文件需要import B中的内容,B中需要import A中的内容。但是直接import的话会报错。

解决方法:分层设计,即上层可以引用下层,下层不可引用上层

分层为:上层:operations 中层:courses 下层:users

course(课程)相关的表设计

补充:关于import的规范:第一部分是python自己的库,第二部分是框架的库,第三部分为自己定义的库。每个部分之间用空行隔开

设计表结构的注意事项:

1、实体间的关系:一对多,多对多。

课程-章节:一个课程有多个章节

章节-小节:一个章节有多个小节(视频)

课程-资料:一个课程对应多个课程资源

所以有四个实体:课程 章节 小节 资料

2、实体的具体字段

3、每个字段的类型,是否必填(默认为必填)

为了方便继承,我们创建一个Basemodel,并放入到users的model.py中(因为users属于下层)

from datetime import datetime

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


class BaseModel(models.Model): # 方便被继承的基础类
    c_time = models.DateTimeField(default=datetime.now, verbose_name='创建时间')
    # 自动生成创建时间,注意不要写成datetime.now(),那样无法在生成实例的时候实时生成创建时间

    class Meta:
        abstract = True # 这样就不会生成BASE的表
           

在courses/model.py中写入:

class Course(BaseModel):
    name = models.CharField(verbose_name='课程名', max_length=100)
    desc = models.CharField(verbose_name='课程描述', max_length=300)
    learn_times = models.IntegerField(verbose_name='学习时长(分钟)', default=0)
    click_nums = models.IntegerField(verbose_name='点击量', default=0)
    student_nums = models.IntegerField(verbose_name='学生数', default=0)
    tag = models.CharField(verbose_name='标签', default='', max_length=20)

    detail = models.TextField(verbose_name='课程详情')
    course_img = models.ImageField(upload_to='course_img/%Y/%m', default='course_img.default_img.jpg')

    # 课程的封面,默认封面暂未设计好

    class Meta:
        verbose_name = '课程信息'
        verbose_name_plural = '课程信息'


class Lesson(BaseModel):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    # 使用ForeignKey来引入外键,on_delete:删除了外键后是否保留当前数据, CASCADE——级联删除
    # 此处设计为course删除后,不保留Lesson数据

    class Meta:
        verbose_name = '课程章节'
        verbose_name_plural = '课程章节'
           

Teacher表的设计

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

from apps.users.models import BaseModel


class Teacher(BaseModel):
    gender_choices = (('male', '男'),
                      ('female', '女'))

    name = models.CharField(max_length=20, verbose_name='教师名称', null=False)
    desc = models.TextField(verbose_name='教师简介')
    profile = models.ImageField(upload_to='profile_img/teacher/%Y/%m', verbose_name='头像', max_length=100,
                                default='/profile_img/teacher/default_profile.png')
    gender = models.CharField(verbose_name='性别', choices=gender_choices, max_length=6)
    mobile_number = models.CharField(max_length=11, null=False, unique=True, verbose_name='手机号码')
    email = models.EmailField(verbose_name='邮箱', unique=True)
    course_nums = models.ImageField(default=0, verbose_name='课程数')

    class Meta:
        verbose_name = '教师'
        verbose_name_plural = '教师'
           

设计完后,在courses/model.py的Course中引入Teacher外键

from apps.teachers.models import Teacher
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)