寻找Django Schools的模型设计输入

时间:2008-12-05 19:13:41

标签: python django django-models

今天我开始一个小项目来创建一个基于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

7 个答案:

答案 0 :(得分:1)

从快速看,我认为它相当全面。也许您应该允许多个教师参加课程,并允许重复使用父母和学生之间的地址/位置。

作为一般规则,我会说你应该开始实施,然后你会找到你需要改进的地方。

答案 1 :(得分:1)

一些可能的问题:

对于位置对象,如果将来您需要为某人保留家庭住址,工作地址等,该怎么办?电子邮件地址和电话号码也一样 - 我的电话号码就是他们自己的对象。

在地址对象上包含Address_3。

答案 2 :(得分:0)

看起来像一个有趣的项目。请注意,Django具有比SQL更高级的类型,因此您可以使用电子邮件地址类型之类的内容。

如果您计划定位GAE,则应该找到同样丰富的set of model types

答案 3 :(得分:0)

嘿......我同意......看起来很不错。有人建议我在所有表上使用自动增量,以确保每条记录上都有唯一的ID。如果你想走那条路,这是你的选择。

答案 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 ...

这更自然,因为您可以与学生一起上课,并根据学生名单参加考试,或以自然的方式汇总成绩,学生年龄等。