from django.db import models

# Create your models here.

from django.contrib.auth.models import User

course_type_choices = (('online',u'网络班'),
('offline_weekend',u'面授班(周末)'),
('offline_fulltime',u'面授班(脱产)'),
) # 校区表
class School(models.Model):
name = models.CharField(max_length=128,unique=True) # unique=True 的作用是返回给前端或者调用的时候不是一个对象,而是一个具体的数据,能区别他是谁
city = models.CharField(max_length=64)
addr = models.CharField(max_length=128) def __str__(self):
return self.name # 基本用户表
class UserProfile(models.Model):
# user = models.ForeignKey(User) # 我们想使用Django自带的User进行验证,但是不能用ForeignKey(),因为不能让一个内部账户对应多个用户
user = models.OneToOneField(User,verbose_name=u"关联用户")
# 使用Django models里的OneToOneField(),实现限制一个内部账户对应一个用户,
# 只是在Django admin层面中实现了1对1,mysql本身是不具有实现1对1外键的.
# 底层用的ForeignKey()
name = models.CharField(u"姓名",max_length=64) # u"姓名"这个是在admin后台管理时显示的字段名也可以用verbose_name=u'姓名',这两个的区别是,verbose_name可以用在任何字段里,而u"姓名"不能用于ForeignKey()等特殊字段,用户名,最大长度64.
school = models.ForeignKey(School) # 一个用户最少要属于一个中心
def __str__(self):
return "%s(%s)"%(self.name,self.school)
class Meta:
verbose_name = u"用户" # 单数形势显示verbose_name的意思很简单,就是给你的模型类起一个更可读的名字
verbose_name_plural = u"用户" # 复数形势显示,如果不指定Django会自动在模型名称后加一个’s’,比如默认显示成 User profiles # 定义课程表
class Course(models.Model):
name = models.CharField(max_length=64,unique=True)
online_price = models.IntegerField()
offline_price = models.IntegerField()
inroduction = models.TextField() #课程介绍字段 def __str__(self):
return self.name # 写一个班级表
class ClassList(models.Model):
course = models.ForeignKey(Course,verbose_name=u"课程")
semester = models.IntegerField(verbose_name=u"学期") teachers = models.ManyToManyField(UserProfile)
start_date = models.DateField()
graudate_date = models.DateField()
# 创建班级时要分网络版和面授班(脱产\周末)
# 我们在创建客户信息表时,就选择了咨询的课程类型.这里又用到这个课程类型.所以是不是要在这里又重新写一遍.但是我如果不想写呢?
# 不想写就把 在客户信息表中写的 course_type_choices ,放到class外面,这样就是全局变量,多个class都可以使用
course_type = models.CharField(max_length=64,choices=course_type_choices) def __str__(self):
return "%s(%s)(%s)"%(self.course.name,self.course_type,self.semester) class Meta:
unique_together = ('course','semester','course_type') # 客户表,存储客户咨询信息
class Customer(models.Model):
qq = models.CharField(max_length=64,unique=True)
name = models.CharField(max_length=32,blank=True,null=True)
# phone = models.IntegerField() #不能用IntegerField,不够长最长10位
phone = models.BigIntegerField(blank=True,null=True) #blank=True 允许在admin层面为空,null在数据库层面允许为空
course = models.ForeignKey(Course)
# 1.课程类型越来越多(每一个课程都有网络和面授) 2.动态更新课程信息 鉴于这两个条件,课程记录应该单独做一张表
# course_type_choices = (('online',u'网络班'),
# ('offline_weekend',u'面授班(周末)')
# ('offline_fulltime',u'面授班(脱产)')
# )
course_type = models.CharField(max_length=64,choices=course_type_choices,default='offline_weekend') # 定义咨询类型字段,choices 这里只是在Django admin层面变成可选的
# 对于Django API 不回默认选择框
consult_memo = models.TextField()
# 搞一个变量,如下,来源选择列表
source_type_choices = (('qq',u'qq群'),
('referral',u"内部转介绍"),
('51cto',u"51cto"),
('agent',u"招生代理"),
('others',u'其它')
)
source_type = models.CharField(choices=source_type_choices,max_length=128,default='qq')
# 学员转介绍,创建一个字段,关联本表中某一个客户,知识点关联自己,重点在于ForeignKey('self'),是加引号的self,因为自己还没被创建,或者写自己的表名ForeignKey('Customer')
referral_from = models.ForeignKey('self',blank=True,null=True,related_name='referral_who')
status_choieses = (('signed',u"已报名"),
('unregistered',u"未报名"),
('graduated',u"已毕业"),
('drop-off',u"退学")
)
status = models.CharField(max_length=64,choices=status_choieses)
consultant = models.ForeignKey('UserProfile',verbose_name=u"课程顾问") # verbose_name的作用是用form类或者admin后台显示中文
class_list = models.ManyToManyField('ClassList',blank=True) # 如果报名,可以关联班级表,多对多
date = models.DateField(u"咨询日期",auto_now_add=True) #默认填入当前日期 def __str__(self):
return "%s(%s)"%(self.qq,self.name) # 客户追踪记录
# 首先我们相当的是记录到客户表汇总.但是一个客户可能有多条咨询记录,我们在用户表中只有一个字段是记录咨询记录的.我们肯定要有多条记录,所以要专门创建一个表来存储咨询记录
class CustomerTrackRecord(models.Model):
customer = models.ForeignKey(Customer) #关联客户
track_record = models.TextField(u"跟踪记录")
track_date = models.DateField()
follower = models.ForeignKey(UserProfile) #跟踪人
status_choices = ((1,u"近期无报名计划"),
(2,u"2个月内报名"),
(3,u"1个月内报名"),
(4,u"2周内报名"),
(5,u"1周内报名"),
(6,u"2天内报名"),
(7,u"已报名"),
)
status = models.IntegerField(choices=status_choices,help_text=u"选择客户此时的状态") # 咨询的结果状态
def __str__(self):
return self.customer # 班级上课记录表
# 首先我们在客户表中创建了客户与班级的关联,每一个班级可以反向查找有都少学生
# 但是每一个班级又有很多天的课程,是不是应该创建一个上课表,表中把班级关联起来.然后把班级里的每一个学员关联起来记录这个学生每天的学习情况
class CourseRecord(models.Model):
class_obj = models.ForeignKey(ClassList)
day_num = models.IntegerField(u"第几节课") #显示的时候"第几节课"
course_date = models.DateField(auto_now_add=True,verbose_name=u"上课时间")
teacher = models.ForeignKey(UserProfile) # 讲师
# students = models.ManyToManyField(Customer) # 这个字段用manytomany的方式体现学员和上课记录的关系.那么问题来了,我们知道manytomany定义后会产生一张关系表.
# 那么我们怎么体现学生是不是迟到呢?你在创建的时候怎么确认哪些人来哪些人没来.你可以说点名后创建记录,但是你能体现迟到不迟到吗.当然不可以.
# 理想的方式是这里不用manytomany的方式关联students,而是另外创建一个学习记录表.学习记录可以为每一个学员关联班级上课记录表,所以这里注释掉
def __str__(self):
return "%s,%s"%(self.class_obj,self.day_num) class Meta:
unique_together = ('class_obj','day_num') # 同一个班级不能出现同一天的课程2次 # 学员的学习记录表,签到状态,成绩
class StudyRecord(models.Model):
student = models.ForeignKey(Customer)
record_choices = (('checked',u"已签到"),
('late',u"迟到"),
('noshow',u"缺勤"),
('leave_early',u"早退"),
)
record = models.CharField(u"状态",choices = record_choices,max_length=64)
#此处需要注意,当我们在html模版文件中或者在admin后台管理显示记录时,record显示的是英文,而不是选项里的中文.
# 如果想显示中文在html模版文件中就需要写成 obj.get_record_display,而在admin中定义表admin时,get_record_display
#关联班级上课记录表
course_record = models.ForeignKey(CourseRecord)
score_choices = ((100,'A+'),
(90,'A'),
(85,'B+'),
(80,'B'),
(70,'B-'),
(60,'C+'),
(50,'C'),
(40,'C-'),
(0,'D'),
(-1,'N/A'),
(-100,'COPY'),
(-1000,'FAIL'),
)
score = models.IntegerField(u"本节成绩",choices=score_choices,default=-1)
date = models.DateField()
note = models.CharField(u"备注",max_length=255,blank=True,null=True) def __str__(self):
return "%s,%s,%s,%s"%(self.course_record,self.student,self.record) # 对于admin后台显示问题的总结:
# 1.对于本身这个表在后台管理界面时,每张表都是英文表名,如果想显示成中文就需要在表类中定义如下:
# class Meta:
# verbose_name = u"用户" # 单数形势显示verbose_name的意思很简单,就是给你的模型类起一个更可读的名字
# verbose_name_plural = u"用户" # 复数形势显示,如果不指定Django会自动在模型名称后加一个’s’,比如默认显示成 User profiles # 2.1 默认表中的记录显示的是对象.可以定义
# def __str__(self):
# return "%s,%s"%(self.name,self.school)
# 当只显示一个字段时显示的格式 # 2.2 表中的记录默认显示的是对象,如果想定义显示多个字段,可以在admins.py文件中定义显示哪几个字段,如:
# class BookAdmin(admin.ModelAdmin):
# list_display = ('title','publisher','publication_date') #指定显示的字段
#
# admin.site.register(models.Author)
# admin.site.register(models.Book,BookAdmin) # 注册的时候,把定义的BookAdmin类作为参数传入进来
# admin.site.register(models.Publisher)
# 3.表中字段名称的显示默认是字段名,可以通过verbose_name="中文名" 显示成中文

python2.0_day19_后台数据库设计思路的更多相关文章

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计

    笔记 4.在线教育后台数据库设计     简介:讲解后端数据库设计    ,字段冗余的好处,及常见注意事项 1.数据库设计:          er图:          实体对象:矩形        ...

  2. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

  3. python2.0_day19_充分使用Django_form实现前端操作后台数据库

    在前面的<python2.0_day19_学员管理系统之前端用户交互系统>一节中,我们实现了前端展示customer客户纪录.在<python2.0_day19_前端分页功能的实现& ...

  4. legend2---开发日志1(legend的数据库整体设计思路是什么)

    legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...

  5. MySQL系列(十二)--如何设计一个关系型数据库(基本思路)

    设计一个关系型数据库,也就是设计RDBMS(Relational Database Management System),这个问题考验的是对RDBMS各个模块的划分, 以及对数据库结构的了解.只要讲述 ...

  6. 项目依赖模块解决、二次封装Response、后台数据库配置、user模块user表设计、前台创建及配置

    今日内容概要 二次封装Response 后台数据库配置 user模块user表设计 前台创建及配置 内容详细 补充--项目依赖模块 # 导出项目依赖模块和安装项目依赖模块 第三方模块--->导出 ...

  7. 基于ASP.Net Core开发一套通用后台框架记录-(数据库设计(权限模块))

    写在前面 本系列博客是本人在学习的过程中搭建学习的记录,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 前期我不会公开源码,我想是一点点敲代码,不然复制.粘贴那就没意思了. ...

  8. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(1)之数据库设计

    本文主要讲解本项目网站所应用到的知识点,及数据库的相关设计: 一.知识点 (1)本项目主要采取ASP.NET MVC的编程模式,相信你已经了解到了MVC的具体含义是什么,这里不再赘述,有不了解的朋友, ...

  9. NetCore微服务简单流程审批数据库设计及后台服务开发

    1.数据库设计 -- ---------------------------- -- Table structure for TBase_Flow -- ----------------------- ...

随机推荐

  1. SQLSERVER NULL值判断

    sqlserver 在判断数据条件时,如果数据包含null的话则永远为false,null不参与判断,可以使用isnull(列,默认值)来判断null值的数据列,或者列 is null or 列的条件 ...

  2. java Map & List 遍历

    一.Map 遍历 public static void main(String[] args) { Map<String, String> map = new HashMap<Str ...

  3. 基于HTML5/CSS3图片网格动画特效

    现在HTML5技术可以让网页上的图片变得非常神奇,各种各样的HTML5图片动画特效让你眼花缭乱.今天要分享的这款HTML5图片网格动画特效就非常炫酷.图片缩略图按网格的布局一行行排列,你只需点击按钮即 ...

  4. 【Unity笔记】一些Mecanim动画系统、状态机的参数细节

    动画混合树Blend Tree调整动画片段的播放速度: 0 动画不播放 -1 动画倒着播放:如果只有“往前走”的动画,可以变成“往后走”动画 勾选动画是否镜像: 左右颠倒(挥左手变成挥右手) 过度条件 ...

  5. kernel printk信息显示级别

    涉及文件:kernel/printk.c include/linux/kernel.h用printk内核会根据日志级别把消息打印到当前控制台上.信息正常输出前提是--日志输出级别(msg_log_le ...

  6. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  7. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  8. PixelMatorPro快捷键大全(osx)

    Keyboard Shortcuts Navigate an image   Zoom in Command-Plus (+) Zoom out Command-Minus (-) Zoom to f ...

  9. Springboot 之 Hibernate自动建表(Mysql)

    Springboot 之 Hibernate自动建表(Mysql) 2016年10月21日 10:39:44 阅读数:8180 本文章来自[知识林] 引入Maven依赖包 <dependency ...

  10. js学习笔记30----对象

    面向对象 对象:是一个整体,对外提供一些操作.JavaScript的所有数据都可以被视为对象.简单说,所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-value)构成. 比如说: var ...