python管理数据库设计_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="中文名" 显示成中文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值