من یک  اپایکیشن میخام طراجی کنم برای مدارس که امکانات زیر رو داشته باش



اول اینکه  مربیان هر کلای بتونن بصورت دوره ای یا روزانه از دانش آموز یک کلاس و یم درس خاص از یک  کتاب درسی  امتحان بگیرن
مربیان بتونن برای خودشون برای کتب و دروس مختلف لامک سوالات داشته باشن تا سوالاتی که برای هر دانش آموز استفاده میشه با سوالات دانش آموز دیگر متفاوت باشه 

والدین بتونن بصورت روزانه یا دوره ای از دانش آموزان امتحان بگیرن 
والدین بتونن بانک سوالات ایجاد کنن برای فرزندشون و برای هر درس از یک کتاب درسی 

نمرات دانش آموزان به همران پاسخ های درست و غلط در هر آزمون ثبت بشه تا هم نفرات برتر هر ماه مشخص بشه و هم والدین و مربیان بتونن متوجه بشن هر دانش آموز چه ایرادی داره تا در آزمون های بعدی سوالات غلط پاسخ داده شده آزمون قبلی رو محددا ازشون آزمون بگیرن




من ی سری کد نوشتم که با توچخ به توضیحاتی که دادم  ویرایششون کن و چیز دیگ ای هم لازم بود بهش اضافه کن


from django.db import models
from app_account.models import CustomUser  
from django.utils import timezone


class School(models.Model):
    name = models.CharField(max_length=255, verbose_name='نام مدرسه')
    contact_number = models.CharField(max_length=15, verbose_name='شماره تماس')
    city = models.CharField(max_length=100, verbose_name='شهر')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_schools'
        verbose_name_plural = 'مدارس'

class Grade(models.Model):
    name = models.CharField(max_length=50, verbose_name='نام پایه')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_grades'
        verbose_name_plural = 'پایه‌ها'

class Book(models.Model):
    name = models.CharField(max_length=255, verbose_name='نام کتاب')
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE, verbose_name='پایه')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_books'
        verbose_name_plural = 'کتب'

class Subject(models.Model):
    name = models.CharField(max_length=255, verbose_name='نام درس')
    book = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name='کتاب')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_subjects'
        verbose_name_plural = 'دروس'

class Class(models.Model):
    name = models.CharField(max_length=255, verbose_name='نام کلاس')
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE, verbose_name='پایه')
    school = models.ForeignKey(School, on_delete=models.CASCADE, verbose_name='مدرسه')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'tbl_classes'
        verbose_name_plural = 'کلاس‌ها'

class Student(models.Model):
    username = models.OneToOneField(CustomUser, on_delete=models.CASCADE, verbose_name='نام کاربری')
    school = models.ForeignKey(School, on_delete=models.CASCADE, verbose_name='مدرسه')
    class_name = models.ForeignKey(Class, on_delete=models.CASCADE, verbose_name='کلاس')

    def __str__(self):
        return f"{self.username.first_name} {self.username.last_name}"

    class Meta:
        db_table = 'tbl_students'
        verbose_name_plural = 'دانش‌آموزان'

class Parent(models.Model):
    username = models.OneToOneField(CustomUser, on_delete=models.CASCADE, verbose_name='نام کاربری')
    students = models.ManyToManyField(Student, related_name='parents', verbose_name='دانش‌آموزان')

    def __str__(self):
        return f"{self.username.first_name} {self.username.last_name}"

    class Meta:
        db_table = 'tbl_parents'
        verbose_name_plural = 'والدین'

class Teacher(models.Model):
    username = models.OneToOneField(CustomUser, on_delete=models.CASCADE, verbose_name='نام کاربری')
    position = models.CharField(max_length=50, verbose_name='سمت')  # e.g., 'Teacher', 'Assistant', 'Principal'
    schools = models.ManyToManyField(School, verbose_name='مدارس')
    classes = models.ManyToManyField(Class, verbose_name='کلاس‌ها')
    subjects = models.ManyToManyField(Subject, verbose_name='دروس')

    def __str__(self):
        return f"{self.username.first_name} {self.username.last_name}"

    class Meta:
        db_table = 'tbl_teachers'
        verbose_name_plural = 'مربیان'

class StudentLesson(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='دانش‌آموز')
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, verbose_name='مربی')
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='درس')

    def __str__(self):
        return f"{self.student} - {self.teacher} - {self.subject}"

    class Meta:
        db_table = 'tbl_student_lessons'
        verbose_name_plural = 'دروس دانش‌آموزان'

class ExamQuestion(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, verbose_name='مربی', null=True, blank=True)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE, verbose_name='والدین', null=True, blank=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='درس')
    school = models.ForeignKey(School, on_delete=models.CASCADE, verbose_name='مدرسه')
    class_name = models.ForeignKey(Class, on_delete=models.CASCADE, verbose_name='کلاس')
    question_text = models.TextField(verbose_name='متن سوال')
    correct_answer = models.TextField(verbose_name='پاسخ صحیح')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='تاریخ به‌روزرسانی')

    def __str__(self):
        return f"{self.subject} - {self.class_name} - {self.question_text[:50]}"

    class Meta:
        db_table = 'tbl_exam_questions'
        verbose_name_plural = 'سوالات امتحانی'

class StudentAnswer(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='دانش‌آموز')
    exam_question = models.ForeignKey(ExamQuestion, on_delete=models.CASCADE, verbose_name='سوال امتحانی')
    answer_text = models.TextField(verbose_name='پاسخ دانش‌آموز')
    is_correct = models.BooleanField(default=False, verbose_name='صحیح است')
    score = models.IntegerField(default=0, verbose_name='نمره')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='تاریخ به‌روزرسانی')

    def __str__(self):
        return f"{self.student} - {self.exam_question}"

    class Meta:
        db_table = 'tbl_student_answers'
        verbose_name_plural = 'پاسخ‌های دانش‌آموزان'  

class Attendance(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='دانش‌آموز')
    date = models.DateField(verbose_name='تاریخ')
    status = models.CharField(max_length=10, choices=[('Present', 'حاضر'), ('Absent', 'غایب')], verbose_name='وضعیت')

    def __str__(self):
        return f"{self.student} - {self.date} - {self.status}"

    class Meta:
        db_table = 'tbl_attendance'
        verbose_name_plural = 'حضور و غیاب'

class Assignment(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, verbose_name='مربی')
    class_name = models.ForeignKey(Class, on_delete=models.CASCADE, verbose_name='کلاس')
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='درس')
    title = models.CharField(max_length=255, verbose_name='عنوان')
    description = models.TextField(verbose_name='توضیحات')
    due_date = models.DateField(verbose_name='تاریخ تحویل')

    def __str__(self):
        return f"{self.title} - {self.class_name} - {self.due_date}"

    class Meta:
        db_table = 'tbl_assignments'
        verbose_name_plural = 'تکالیف'

class Event(models.Model):
    title = models.CharField(max_length=255, verbose_name='عنوان')
    description = models.TextField(verbose_name='توضیحات')
    date = models.DateField(verbose_name='تاریخ')
    time = models.TimeField(verbose_name='زمان')
    location = models.CharField(max_length=255, verbose_name='مکان')

    def __str__(self):
        return f"{self.title} - {self.date} - {self.location}"

    class Meta:
        db_table = 'tbl_events'
        verbose_name_plural = 'رویدادها'

class DailyQuestion(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='دانش‌آموز')
    question = models.ForeignKey(ExamQuestion, on_delete=models.CASCADE, verbose_name='سوال امتحانی')
    date = models.DateField(default=timezone.now, verbose_name='تاریخ')

    def __str__(self):
        return f"{self.student} - {self.question} - {self.date}"

    class Meta:
        db_table = 'tbl_daily_questions'
        verbose_name_plural = 'سوالات روزانه'

class DailyAnswer(models.Model):
    daily_question = models.ForeignKey(DailyQuestion, on_delete=models.CASCADE, verbose_name='سوال روزانه')
    answer_text = models.TextField(verbose_name='پاسخ دانش‌آموز')
    is_correct = models.BooleanField(default=False, verbose_name='صحیح است')
    score = models.IntegerField(default=0, verbose_name='نمره')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='تاریخ به‌روزرسانی')

    def __str__(self):
        return f"{self.daily_question} - {self.answer_text[:50]}"

    class Meta:
        db_table = 'tbl_daily_answers'
        verbose_name_plural = 'پاسخ‌های روزانه'

class TopStudent(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='دانش‌آموز')
    month = models.DateField(verbose_name='ماه')
    total_score = models.IntegerField(verbose_name='مجموع نمرات')
    evaluator = models.CharField(max_length=50, choices=[('Teacher', 'مربی'), ('Parent', 'والدین')], verbose_name='ارزیاب')

    def __str__(self):
        return f"{self.student} - {self.month} - {self.evaluator}"

    class Meta:
        db_table = 'tbl_top_students'
        verbose_name_plural = 'دانش‌آموزان نمونه ماه'