Нужна помощь в создании схемы базы данных - PullRequest
0 голосов
/ 19 октября 2019

Текущая схема базы данных - У меня есть эти 3 таблицы, Curriculum, Assignment и Student. Каждому Student присваивается отношение Curriculum - ForeginKey между учеником и учебным планом. Каждый Assignment имеет такое же отношение с Curriculum, используя ForeginKey.

Постановка задачи - Для каждого Curriculum существует около 100 Assignments, проблема в том, что некоторые студенты должны быть освобождены от некоторых заданий, поэтому я хочу, чтобы я могосвободите ученика от заданий 1, 2 и 3, но пусть остальные ученики выполнят задания 1, 2 и 3.

Мое решение, которое не удалось - Я пытался создатьManyToManyField в Student таблице относительно Assignment таблицы. Однако необходимость добавления сотен заданий вручную будет смехотворно трудоемкой для каждого студента.

class Curriculum(models.Model):
    name = models.CharField(max_length=50, null=False)
    subject = models.CharField(max_length=30, choices=SUBJECT)
    grade_level = models.CharField(max_length=20, choices=CURRICULUMGRADE, null=False)
    tracking = models.CharField(max_length=20, choices=TRACKING, null=False)
    required = models.CharField(max_length=20, null=True)
    recorded_from = models.CharField(max_length=20, choices=RECORDED, null=False)
    semesterend = models.CharField(max_length=50, null=True)
    username = models.CharField(max_length=50, null=True)
    password = models.CharField(max_length=50, null=True)
    loginurl = models.CharField(max_length=100, null=True)
    weight = models.IntegerField(null=True)
    level = models.CharField(max_length=20, choices=LEVEL, null=False)

class Student(models.Model):
    epicenter_id = models.CharField(
        null=False, blank=False, unique=True, max_length=10
    )
    last_name = models.CharField(null=False, max_length=50)
    first_name = models.CharField(null=False, max_length=50)
    email = models.EmailField(null=False, max_length=120)
    phone_number = models.CharField(null=False, max_length=50)
    additional_email = models.EmailField(max_length=120, null=True)
    additional_phone_number = models.CharField(max_length=20, null=True)
    grade = models.CharField(max_length=20, choices=GRADELEVEL, null=False)
    curriculum = models.ForeginKey('curriculum', null=True, blank=True, on_delete=models.SET_NULL)

class Assignment(models.Model):
    standard = models.ManyToManyField(
        Standard)
    curriculum = models.ForeignKey(
        Curriculum, on_delete=models.CASCADE, related_name="curriculum_assignment"
    )
    name = models.CharField(max_length=500, null=False)
    description = models.CharField(max_length=500, null=False)
    status = models.CharField(max_length=30, choices=STATUS, null=False)
    type_of = models.CharField(max_length=30, choices=TYPE, null=False)

1 Ответ

0 голосов
/ 19 октября 2019

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

models.py

class ExemptAssignments(models.Model):
    student = models.ForeginKey('student', null=True, blank=True, on_delete=models.SET_NULL)
    assignments = models.ManyToMany('assignment', null=True, blank=True)

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

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

student = Student.objects.first()
Assignment.objects.filter(curriculum=student.curriculum).exclude(id__in=[x.id for x i in ExemptAssignment.objects.filter(student=student).assignment.all()]

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

...