今天我开始一个小项目来创建一个基于Django的学校管理计划。我正在设计模型及其相应的关系。对于Django和一般的关系数据库来说相当新,我想要一些输入。
在我向您展示当前的模型布局之前,您需要了解该程序的用途。请记住,我的目标是使个人学校和整个学校系统都能使用该软件。
特点:
- 创建多所学校
- 跟踪每所学校的学生人数
- 跟踪学生人口统计,父母联系信息等
- 等级书籍
- 成绩单
- 跟踪纪律记录
- 费用表和付款跟踪
- 生成报告(学生活动,学生成绩单,课程进度,按人口统计学进度,付款报告,学生班级和人口统计学的纪律报告)
- 向家长提供自动PDF报告电子邮件,以便学生报告。
鉴于这些功能要求,以下是我目前拥有的模型布局: 模型
* Person
o ID: char or int
o FirstName: char
o MiddleName: char
o FamilyName: char
o Sex: multiple choice
o Ethnicity: multiple choice
o BirthDate: date
o Email: char
o HomePhone: char
o WordPhone: char
o CellPhone: char
o Address: one-to-one with Location
* Student (inherent Person)
o Classes: one-to-many with Class
o Parents: one-to-many with Parent
o Account: one-to-one with PaymentSchedule
o Tasks: one-to-many with Tasks
o Diciplin: one-to-many with Discipline
* Parent (inherent Person)
o Children: one-to-many with Student
* Teacher (inherent Person)
o Classes: one-to-many with Class
* Location
o Address: char
o Address2: char
o Address3: char
o City: char
o StateProvince: char
o PostalCode: char
o Country: multiple choice
* Course
o Name: char
o Description: text field
o Grade: int
* Class
o School: one-to-one with School
o Course: one-to-one with Course
o Teacher: one-to-one with Teacher
o Students: one-to-many with Student
* School
o ID: char or int
o Name: char
o Location: one-to-one with location
* Tasks
o ID: auto increment
o Type: multiple choice (assignment, test, etc.)
o DateAssigned: date
o DateCompleted: date
o Score: real
o Weight: real
o Class: one-to-one with class
o Student: one-to-one with Student
* Discipline
o ID: auto-increment
o Discription: text-field
o Reaction: text-field
o Students: one-to-many with Student
* PaymentSchedule
o ID: auto-increment
o YearlyCost: real
o PaymentSchedule: multiple choice
o ScholarshipType: multiple choice, None if N/A
o ScholarshipAmount: real, 0 if N/A
o Transactions: one-to-many with Payments
* Payments
o auto-increment
o Amount: real
o Date: date
如果你有关于如何改进它的想法,我很想年复一年!
我已经编写了最初的models.py代码,这可能需要很多爱。如果您想查看,甚至加入项目,请查看链接 http://bazaar.launchpad.net/~djangoschools/djangoschools/trunk/files
答案 0 :(得分:1)
从快速看,我认为它相当全面。也许您应该允许多个教师参加课程,并允许重复使用父母和学生之间的地址/位置。
作为一般规则,我会说你应该开始实施,然后你会找到你需要改进的地方。
答案 1 :(得分:1)
一些可能的问题:
对于位置对象,如果将来您需要为某人保留家庭住址,工作地址等,该怎么办?电子邮件地址和电话号码也一样 - 我的电话号码就是他们自己的对象。
在地址对象上包含Address_3。
答案 2 :(得分:0)
看起来像一个有趣的项目。请注意,Django具有比SQL更高级的类型,因此您可以使用电子邮件地址类型之类的内容。
如果您计划定位GAE,则应该找到同样丰富的set of model types。
答案 3 :(得分:0)
答案 4 :(得分:0)
您应该将paiement(交易)链接到相关人员。
答案 5 :(得分:0)
我建议你不要担心底层关系数据库。是的,您需要了解外键是什么以及多对多和一对多之间的区别等,但您应该根据Django类来考虑您的模型。这就是你无论如何都要写它们的方式,所以这就是我要开始的地方。 Django documenation on models很棒,对你很有帮助。
我想这里的每个人都很乐意帮助你学习Python课程;你应该使用Django重写你的例子。例如,您的Person表将如下所示:
from django.db import models
SEX_CHOICES = (
('M', 'Male'),
('F', 'Female')
)
ETHNICITY_CHOICES = (
# follow the same format as SEX_CHOICES:
# (database_value, human_friendly_name)
)
class Person(models.Model):
first_name = models.CharField(max_length=200)
middle_name = models.CharField(max_length=200)
familiy_name = models.CharField(max_length=200)
sex = models.CharField(max_length=1, choices=SEX_CHOICES)
ethnicity = models.CharField(max_length=1, choices=ETHNICITY_CHOICES)
birth_date = models.DateField()
email = models.EmailField()
home_phone = models.CharField(max_length=10) # USA phone numbers
work_phone = models.CharField(max_length=10)
cell_phone = models.CharField(max_length=10)
address = models.ForeignKey(Location)
class Location(models.Model):
# left as an exercise for the reader
# more classes...
答案 6 :(得分:0)
学生没有上课。他/她参加了一个有他们的课程(在名单中)。这是另一种看待阶级情况的方法。 (请注意模型的名称。这只是因为我倾向于不将任何名称命名为“类”,因为这样很容易引起名称冲突。)
class SchoolClass(models.Model):
teacher = models.ManyToManyField(Teacher, related_name='teachers')
student = models.ManyToManyField(Student, related_name='students')
prerequisites = models.ForeignKey('self')
startdate = models.DateField()
enddate = models.DateField()
... and so on ...
这更自然,因为您可以与学生一起上课,并根据学生名单参加考试,或以自然的方式汇总成绩,学生年龄等。