Как создать динамические модели времени в django?

Я пытаюсь построить систему управления школой на django. В ней каждый год имеет 3 семестра, каждый из которых длится 4 месяца, т.е. 2022/2023 - 1-й семестр, 2-й семестр и 3-й семестр.

Каждый семестр динамичен и переходит к следующему семестру через 4 месяца, но если это 3-й семестр, он автоматически корректирует год, добавляя год и начиная с 1-го семестра, т.е. 2023/2024, затем после завершения 3 семестров переходит к 2024/2025 при пересчете с 1-го семестра (3 × 4 месяца = год)

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

Система автоматически повышает уровень студентов каждого класса/уровня после 3-го семестра, так что они начинают новый уровень с 1-го семестра каждый год. Т.е. 100 уровень переходит на 200 уровень, а студенты 200 уровня переходят на 300 уровень после каждого года

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

Как мне создать функцию таймера из 4 месяцев для каждого семестра и года для года? Как сделать это динамическим, не трогая код или базу данных? Есть ли технологии, которые я должен добавить к django, чтобы достичь того, что я хочу? Пожалуйста, помогите мне

Для обработки таких случаев можно создать свойства модели. Предполагая, что вы уже храните данные о зачисленном годе и зачисленном уровне каждого студента, можно использовать следующую модель данных:-

class Student(models.Model):
    student_uuid = models.UUIDField(max_length=50)
    student_name = models.CharField(max_length=200)
    enrolled_date = models.DateField(auto_now=True)
    enrolled_level = models.models.IntegerField()
    
    @property
    def current_semester():
        return datetime.datetime.today().month%4 + 1

    @property
    def current_level():
        return (datetime.datetime.today().year - enrolled_date.year) + enrolled_level
   
Вернуться на верх