python2.0_day19_后台数据库设计思路
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="中文名" 显示成中文
转载于:https://www.cnblogs.com/zhming26/p/5825047.html
python2.0_day19_后台数据库设计思路相关推荐
- python管理数据库设计_python2.0_day19_后台数据库设计思路
from django.db import models # Create your models here. from django.contrib.auth.models import User ...
- 密保问题数据库设计思路和代码实现
用户注册时设置三个密保问题方便用户找回. 数据库设计思路: 用户一张表,用户密保问题答案一张表,密保问题单独一张表.这样做的好处是满足三范式,条理清晰,跟重要的是方便后期更改维护密保问题,比如增加删除 ...
- (转)商城系统商品属性的数据库设计思路
http://www.360doc.com/content/12/0513/18/1542811_210764350.shtml 最近看到一个题目,要求提出一套商品属性相关的数据库设计思路,要求是商品 ...
- 电子商城数据库设计思路
一.设计目标 本次设计为设计一个电子商城,即我们经常在淘宝,京东等网站看到的网店.这只是一个初步的设计,跟实际上的网店还有很多的差距.主要的差距在于数据的并发处理,图片服务器,视频服务器,以及用户访问 ...
- 商城系统商品属性的数据库设计思路
京东商城的数据库是如何搭建的,那么多商品,每种商品的参数各不相同,是怎样设计数据库的? 在提及这种设计思路前,首先得了解数据表可以分为两种结构: 1\横表,也就是我们经常用到的表结构, 2\纵表,这种 ...
- Java_学生信息管理系统-后台数据库设计
功能: 为学生信息管理系统后台数据库进行设计,结果如下图: 图1.数据库数据表 如图2.数据库数据表之间关系
- 单系统站内信数据库设计思路
第一版设计 需求 :单用户之间通信(融合了用户反馈需求) 数据库设计:Message内容和收发者存在一张表中 message表: 这里一条Message存两次,类似邮件服务. status:已读.未读 ...
- 自动回复mysql数据库设计_微信自动回复数据库设计思路【微擎】
多商户设计 关键字触发 查找rule_keyword表 -> rule表 -> 回复资源表[news_reply 图文表.images_reply 图片表.video_reply 视频表. ...
- 仿天猫商城后台数据库设计及运用
仿天猫商城数据库关系 仿天猫商城系统页面 后台数据页面.功能和SQL语句 1. 功能:向数据库category表中插一条数据,后台记录商品类 INSERT INTO category(name)VAL ...
最新文章
- 【软考-软件设计师】计算机系统基础知识
- android怎么根据标题解析json,如何在android中解析没有json对象标题的json数组?
- jquery 请求jsp传递json数据的方法
- Android Studio查看应用数字签名-android学习之旅(76)
- linux wamp,ubuntu wamp server ..................
- BZOJ3312: [Usaco2013 Nov]No Change
- File /usr/bin/pip3, line 9, in module from pip import main ImportError: cannot import name
- Linux教程:10条秘诀确保Linux桌面安全性
- 方差,标准差,协方差,样本标准差,总体标准差,抽样平均误差
- 超级详细的H3C模拟器HCL的交换机Telnet服务配置过程(图文)
- 利用大数据 勾画虚开企业脸谱
- 为什么穷人不敢创业?
- 东舟云 | 您的测试实验室专业管家
- 关于环境依赖问题的反思NO.1
- 玩转X-CTR100 l STM32F4 l DSP指令集性能测试
- 线性二自由度汽车模型的微分方程
- 为什么VDI对核心UNIX®和Linux®工程应用有意义
- XGBoost与GBDT比较
- 小小破解一下百度MP3的加密URL链接
- JQuery选择器和JQuery库文件引入
热门文章
- 深度学习-为什么用激活函数
- github的python代码怎么跑_如何利用Python模拟GitHub登录详解
- php加密后无法读取,无法解密的php加密文件
- 最长公共子序列LCS(动态规划)—详解
- STM32 - CubeMX 的使用实例详细(04.1)- STM32F103的 - 定时器设定详细解释 - PWM波的产生 - 频率占空比的设定 - 软件代码分析
- python htmltestrunner报告_为什么python+htmltestrunner生成的测试报告有问题?
- 组装电脑配置单报价_组装电脑配置单推荐,性价比高的游戏、画图和办公全能配置电脑!...
- c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)
- python解一元三次方程_python/sympy求解矩阵方程的方法
- go reflect 取指针_Go之如何操作结构体的非导出字段