3、Django实战第3天:数据建模
users modesl.py设计
| UserProfile | 用户信息 |
| EmailVerifyRecord | 验证码 |
| Banner | 轮播图 |
之前我们生成了Django默认的数据表,里面有张表示auth-user
mysql> desc auth_user; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | password | varchar(128) | NO | | NULL | | | last_login | datetime(6) | YES | | NULL | | | is_superuser | tinyint(1) | NO | | NULL | | | username | varchar(30) | NO | UNI | NULL | | | first_name | varchar(30) | NO | | NULL | | | last_name | varchar(30) | NO | | NULL | | | email | varchar(254) | NO | | NULL | | | is_staff | tinyint(1) | NO | | NULL | | | is_active | tinyint(1) | NO | | NULL | | | date_joined | datetime(6) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+
根据项目的需求,这些字段无法满足,因此我们还需要添加一些字段;编辑apps.users.models.py 新建一张表继承auth-user表
from django.db import models
from django.contrib.auth.models import AbstractUser #导入auth-user表模块
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name='昵称', default='')
birthday = models.DateField(verbose_name='生日', null=True, blank=True)
gender = models.CharField(max_length=6, choices=(('male', '男'),('female', '女')), default='female')
address = models.CharField(max_length=100, default='')
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to='image/%Y/%m', default='image/default.png', max_length=100)
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
因为上面我们使用到了imageField字段类型,但是imageField字段依赖于Pillow
(mxonline) C:\Users\user>pip install pillow
修改settings.py,设置用户认证模型为我们新建的UserProfile
AUTH_USER_MODEL = 'users.UserProfile' #MIDDLEWARE_CLASSES行上面添加此行
同步数据表到数据库
manage.py@mxonline > makemigrations users manage.py@mxonline > migrate users #中途需要确认,输入yes
进入数据库查看表users_userprofile
mysql> desc users_userprofile ; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | password | varchar(128) | NO | | NULL | | | last_login | datetime(6) | YES | | NULL | | | is_superuser | tinyint(1) | NO | | NULL | | | username | varchar(30) | NO | UNI | NULL | | | first_name | varchar(30) | NO | | NULL | | | last_name | varchar(30) | NO | | NULL | | | email | varchar(254) | NO | | NULL | | | is_staff | tinyint(1) | NO | | NULL | | | is_active | tinyint(1) | NO | | NULL | | | date_joined | datetime(6) | NO | | NULL | | | nick_name | varchar(50) | NO | | NULL | | | birthday | date | YES | | NULL | | | gender | varchar(6) | NO | | NULL | | | address | varchar(100) | NO | | NULL | | | mobile | varchar(11) | YES | | NULL | | | image | varchar(100) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+
apps.users.models.py再加上两张表
from django.db import models
from django.contrib.auth.models import AbstractUser # 导入auth-user表模块
from datetime import datetime
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name='昵称', default='')
birthday = models.DateField(verbose_name='生日', null=True, blank=True)
gender = models.CharField(max_length=6, choices=(('male', '男'), ('female', '女')), default='female')
address = models.CharField(max_length=100, default='')
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to='image/%Y/%m', default='image/default.png', max_length=100)
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name='验证码')
email = models.EmailField(max_length=50, verbose_name='邮箱')
send_type = models.CharField(choices=(('register', '注册'), ('forget', '找回密码'),('hmail', '修改邮箱')), max_length=10, verbose_name='发送类型')
send_time = models.DateField(default=datetime.now, verbose_name='发送时间')
class Meta:
verbose_name = '邮箱验证码'
verbose_name_plural = verbose_name
def __str__(self):
return '{0}({1})'.format(self.code, self.email)
class Banner(models.Model):
title = models.CharField(max_length=100, verbose_name='标题')
image = models.ImageField(upload_to='banner/%Y/%m', verbose_name='轮播图', max_length=100)
url = models.URLField(max_length=200, verbose_name='访问地址')
index = models.IntegerField(default=100, verbose_name='顺序')
add_time = models.DateField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '轮播图'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
最后执行,同步命令同步到数据库
manage.py@mxonline > makemigrations users manage.py@mxonline > migrate users
organization modesl.py设计
| CourseOrg | 课程机构 |
| Teacher | 教师 |
| CityDict | 城市 |
编辑apps.organization.models.py
from django.db import models
from datetime import datetime
class CityDict(models.Model):
name = models.CharField(max_length=20, verbose_name='城市名')
desc = models.CharField(max_length=200, verbose_name='描述')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '城市'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseOrg(models.Model):
name = models.CharField(max_length=50, verbose_name='机构名称')
desc = models.TextField(verbose_name='机构描述')
category = models.CharField(max_length=20, default='jg', choices=(('jg', '机构'), ('gr', '个人'), ('gx', '高校')),
verbose_name='机构类别')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏数')
image = models.ImageField(upload_to='organization/%Y/%m', verbose_name='封面图', max_length=100)
address = models.CharField(max_length=150, verbose_name='机构地址', blank=True)
city = models.ForeignKey(CityDict, verbose_name='所在城市')
students = models.IntegerField(default=0, verbose_name='学习人数')
course_nums = models.IntegerField(default=0, verbose_name='课程数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '课程机构'
verbose_name_plural = verbose_name
def get_teracher_nums(self):
"""获取教师数"""
return self.teacher_set.count()
def __str__(self):
return self.name
class Teacher(models.Model):
org = models.ForeignKey(CourseOrg, verbose_name='所属机构')
name = models.CharField(max_length=50, verbose_name='教师名')
age = models.ImageField(default=18, verbose_name='年龄')
image = models.ImageField(upload_to='teacher/%Y/%m', verbose_name='头像', max_length=100)
work_years = models.IntegerField(default=0, verbose_name='工作年限')
work_company = models.CharField(max_length=50, verbose_name='就职公司')
work_position = models.CharField(max_length=50, verbose_name='公司职位')
points = models.CharField(max_length=50, verbose_name='教学特点')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '教师'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
courses models.py设计
| Course | 课程信息 |
| Lesson | 章节信息 |
| Vdeo | 视频 |
| CourseResource | 课程资源 |
编辑apps.courses.models.py
from django.db import models
from datetime import datetime
from organization.models import CourseOrg
class Course(models.Model):
name = models.CharField(max_length=50, verbose_name='课程名')
course_org = models.ForeignKey(CourseOrg, verbose_name='课程机构')
desc = models.CharField(max_length=300, verbose_name='课程描述')
details = models.TextField(verbose_name='课程详情')
degree = models.CharField(verbose_name='课程难度', choices=(('cj', '初级'), ('zj', '中级'), ('gj', '高级')), max_length=2)
learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟)')
students = models.IntegerField(default=0, verbose_name='学习人数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
image = models.ImageField(upload_to='courses/%Y/%m', verbose_name='封面图', max_length=100)
click_nums = models.IntegerField(default=0, verbose_name='点击数')
category = models.CharField(max_length=20, default='', verbose_name=u'课程类别')
tag = models.CharField(max_length=10, default='', verbose_name=u'课程标签')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '课程'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Lesson(models.Model):
course = models.ForeignKey(Course, verbose_name='课程')
name = models.CharField(max_length=100, verbose_name='章节名')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '章节'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name='章节')
name = models.CharField(max_length=100, verbose_name='视频名')
url = models.URLField(max_length=150, verbose_name='视频地址', null=True, blank=True)
learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟数)')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '视频'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseResource(models.Model):
course = models.ForeignKey(Course, verbose_name='课程')
name = models.CharField(max_length=100, verbose_name='名称')
download = models.FileField(upload_to='course/resource/%Y/%m', verbose_name='资源文件', max_length=100)
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '课程资源'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
operation models.py设计
| UserAsk | 用户咨询 |
| CourseComments | 用户评论 |
| UserFavorite | 用户收藏 |
| UserMessage | 用户信息 |
| UserCourse | 用户学习的课程 |
编辑apps.operation.models.py
from django.db import models
from datetime import datetime
from users.models import UserProfile
from courses.models import Course
class UserAsk(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
mobile = models.CharField(max_length=11, verbose_name='手机')
course_name = models.CharField(max_length=50, verbose_name='课程名')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '用户咨询'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseComments(models.Model):
user = models.ForeignKey(UserProfile, verbose_name='用户')
course = models.ForeignKey(Course, verbose_name='课程')
comments = models.CharField(max_length=200, verbose_name='评论')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '课程评论'
verbose_name_plural = verbose_name
class UserFavorite(models.Model):
user = models.ForeignKey(UserProfile, verbose_name='用户')
fav_id = models.IntegerField(default=0, verbose_name='数据id')
fav_type = models.IntegerField(choices=((1, '课程'),(2, '机构'),(3, '讲师')), default=1, verbose_name='收藏类型')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '用户收藏'
verbose_name_plural = verbose_name
class UserMessage(models.Model):
user = models.IntegerField(default=0, verbose_name='接收用户')
message = models.CharField(max_length=500, verbose_name='消息内容')
has_read = models.BooleanField(default=False, verbose_name='是否已读')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '用户消息'
verbose_name_plural = verbose_name
class UserCourse(models.Model):
user = models.ForeignKey(UserProfile, verbose_name='用户')
course = models.ForeignKey(Course, verbose_name='课程')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '用户课程'
verbose_name_plural = verbose_name
###同步###
每天进步一点,加油!
浙公网安备 33010602011771号