创建项目与app
首先在django中创建一个叫zkonline的项目,创建一个叫zxonline的数据库。
**创建packages:apps、static、media,分别用来存放各应用,css数据等,媒体资源
创建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当中去
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自带有auth_user表,因此我们可以用重载的方式来添加我们自己的字段
首先在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)