Ищем вклад в дизайн модели для школ Django

Сегодня я начинаю небольшой проект по созданию школьной административной программы на основе 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

Если у вас есть идеи, как это можно улучшить, я бы с удовольствием их одобрил!

Обновлять

I've written the initial models.py code, which is probably in need of much love. If you would like to take a look, or even join the project, check out the link.
http://bazaar.launchpad.net/~djangoschools/djangoschools/trunk/files

Было бы неплохо сделать такой вопрос вики сообщества, чтобы мы могли редактировать его напрямую.

Powerlord 05.12.2008 23:56

Проверять. Редактируйте сколько душе угодно!

crashsystems 06.12.2008 00:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
2 364
7

Ответы 7

Беглый взгляд, я думаю, что он довольно всеобъемлющий. Возможно, вам следует разрешить участие нескольких учителей в курсе и разрешить повторное использование адресов / местоположений между родителями и учениками.

Как правило, я бы сказал, что вы должны начать внедрять, и тогда вы найдете то, что вам нужно улучшить.

Спасибо за предложения, которые я рассмотрю. Как вы думаете, мои отношения можно улучшить (не думаю, что это когда-нибудь перестанет звучать смешно!)?

crashsystems 05.12.2008 22:58

Похоже, интересный проект. Обратите внимание, что Django имеет типы более высокого уровня, чем SQL, поэтому вы можете использовать такие вещи, как тип адреса электронной почты.

Если вы планируете настроить таргетинг на GAE, вы должны найти такой же богатый набор типов моделей.

эй ... согласен ... выглядит неплохо. кто-то посоветовал мне использовать автоинкремент для всех таблиц, чтобы убедиться, что для каждой записи действительно есть уникальный идентификатор. это ваш выбор, если вы хотите пойти по этому пути.

Django сделает это за вас, поэтому нет необходимости добавлять его самостоятельно.

Justin Voss 06.12.2008 01:17

Вы должны привязать платеж (транзакцию) к заинтересованному лицу.

У каждого экземпляра Student есть PaymentSchedule, который, в свою очередь, связан с несколькими Payments. Имея это в виду, считаете ли вы, что необходимо привязать каждый платеж к учащемуся?

crashsystems 06.12.2008 00:56

Некоторые возможные проблемы:

Что касается объекта местоположения, что, если в будущем вам понадобится хранить домашний адрес, рабочий адрес и т. д. Для человека? То же самое с адресами электронной почты и телефонными номерами - я бы хотел, чтобы номера телефонов были отдельным объектом.

Включите Address_3 в свой адресный объект.

Хорошая точка зрения. Что насчет этого: я меняю ссылку «один-к-одному» с «Человек - местоположение» на «один-ко-многим» и добавляю поле «Имя» в местоположение. Я думаю, что это позволит любому Человеку (или подклассу) иметь в списке произвольное количество адресов. Кстати, зачем вам разделять номера телефонов?

crashsystems 06.12.2008 00:59

Я бы посоветовал вам не беспокоиться о подчиненной реляционной базе данных. Да, вам нужно понять, что такое внешний ключ и разницу между «многие-ко-многим» и «один-ко-многим» и т. д., Но вы должны думать о своих моделях с точки зрения классов Django. Вот как вам все равно придется их писать, так что я бы начал с этого. Документация Django по моделям великолепен и очень вам поможет.

Я думаю, что все здесь были бы рады помочь вам с классами 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...

Спасибо за совет. Я напишу модельные классы в эфир в эти выходные или в начале следующей недели. Я обязательно опубликую здесь ссылку, когда они будут готовы. Кроме того, я, вероятно, начну проект Django Schools на Launchpad.net, чтобы люди могли напрямую вносить свой код.

crashsystems 06.12.2008 01:48

У ученика нет класса. Он / она посещает класс, в котором они есть (в списке). Вот еще один способ взглянуть на ситуацию в классе. (обратите внимание на название модели. Это просто потому, что я стараюсь ничего не называть классом, потому что таким образом легко попасть в конфликт имен.)

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

Это более естественно, потому что вы можете проводить занятия со студентами и определять посещаемость в соответствии со списком студентов или совокупными оценками, возрастом учащихся и т. д. Естественным образом.

Другие вопросы по теме