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 ###同步###
3、Django实战第3天:数据建模的更多相关文章
- Django博客开发-数据建模与样式设定
开发流程介绍 之前Django的学习过程当中已经把基本Django开发学完了,现在以Django 的博客项目完成一遍课程的回顾和总结.同时来一次完整开发的Django体验. 一个产品从研究到编码我们要 ...
- ES 32 - Elasticsearch 数据建模的探索与实践
目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...
- Elasticsearch 数据建模指南
文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- Storm 实战:构建大数据实时计算
Storm 实战:构建大数据实时计算(阿里巴巴集团技术丛书,大数据丛书.大型互联网公司大数据实时处理干货分享!来自淘宝一线技术团队的丰富实践,快速掌握Storm技术精髓!) 阿里巴巴集团数据平台事业部 ...
- django获取指定列的数据
django获取指定列的数据 model一般都是有多个属性的,但是很多时候我们又只需要查询特定的某一个,这个时候可以用到values和values_list [values()](https://do ...
- 《驾驭Core Data》 第三章 数据建模
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...
- NoSQL 数据建模技术(转)
本文转载自:http://coolshell.cn/articles/7270.html ================================================ 全文译自墙外 ...
- 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典
需求分析是做项目中的极为重要的一环,而作为整个项目中的'血液'--数据,更是重中之重.viso,workbench,phpmyadmin等软件可以帮我们更好的处理数据分析问题. ER图 E-R方法是& ...
随机推荐
- [AT2558]Many Moves
题目大意:有$n$个位置$1,2,\dots n$:你有两个棋子$A$和$B$,你要进行$q$次操作,第$i$次操作给定一个$x_i$,你要选择一个棋子移动到$x_i$:求两个棋子最小移动的步数之和. ...
- Android 架构组件 Room 介绍及使用
关于Room Room是Google官方提供的数据库ORM框架,使用起来非常方便.Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库. Room中三 ...
- 【翻译】为什么Java中的String不可变
笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int.boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在. 但是 ...
- NOIP2016愤怒的小鸟 [状压dp]
愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...
- intellij IDEA与springboot项目建立
概念问题: IntelliJ系中的Project相当于Eclipse系中的workspace.IntelliJ系中的Module相当于Eclipse系中的Project.IntelliJ中一个Proj ...
- Ecplise下设置jQuery和ExtJs自动提示
Spket 1.6.23下载: http://yunpan.cn/cjJYmEcMFIuuN 访问密码 5642 ext jsb下载:http://yunpan.cn/cjJYR7ZTzibQn ...
- lesson 4 再谈继承多态,抽象类和接口
再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...
- bzoj3786 星际探索 splay dfs序
这道题 首先 因为他求的是当前点到根节点的路径和 我们可以将题目转换为括号序列的写法 将点拆为左括号以及右括号 左括号为正 右括号为负 这样题目就变为了求前缀和了 如果一个点是这个点的子树 那么他的左 ...
- HDU 1798 Tell me the area (数学)
题目链接 Problem Description There are two circles in the plane (shown in the below picture), there ...
- [bzoj4034][HAOI2015]树上操作——树状数组+dfs序
Brief Description 您需要设计一种数据结构支持以下操作: 把某个节点 x 的点权增加 a . 把某个节点 x 为根的子树中所有点的点权都增加 a . 询问某个节点 x 到根的路径中所有 ...