Added relationship between subjects and student

This commit is contained in:
Keannu Christian Bernasol 2023-04-11 23:20:01 +08:00
parent ac0f4b5e28
commit 5182dfa8da
9 changed files with 148 additions and 48 deletions

View file

@ -0,0 +1,17 @@
# Generated by Django 4.2 on 2023-04-11 15:10
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('students', '0002_student_current_semester'),
]
operations = [
migrations.RemoveField(
model_name='student',
name='enrolled_subjects',
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 4.2 on 2023-04-11 15:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('students', '0003_remove_student_enrolled_subjects'),
('subjects', '0004_remove_subject_enrolled_count_subjectstudent_and_more'),
]
operations = [
migrations.AddField(
model_name='student',
name='enrolled_subjects',
field=models.ManyToManyField(through='subjects.SubjectStudent', to='subjects.subject'),
),
]

View file

@ -1,5 +1,4 @@
from django.db import models
from django.contrib.postgres.fields import ArrayField
# Create your models here.
@ -37,10 +36,15 @@ class Student(models.Model):
clearance_done = models.BooleanField()
pta_done = models.BooleanField()
#
enrolled_subjects = models.CharField(max_length=800)
enrolled_subjects = models.ManyToManyField(
'subjects.Subject', through='subjects.SubjectStudent')
year_level = models.CharField(max_length=20, choices=YearLevels.choices)
current_semester = models.CharField(
max_length=20, choices=Semesters.choices, default=Semesters.FIRST_SEM)
def __str__(self):
return self.name
return self.first_name
@property
def full_name(self):
return self.first_name + " " + self.middle_name + " " + self.last_name

View file

@ -1,9 +1,12 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Student
from subjects.models import Subject
class StudentSerializer(serializers.HyperlinkedModelSerializer):
enrolled_subjects = serializers.SlugRelatedField(
queryset=Subject.objects.all(), many=True, slug_field='name', allow_null=True)
class Meta:
model = Student

View file

@ -0,0 +1,34 @@
# Generated by Django 4.2 on 2023-04-11 15:10
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('students', '0003_remove_student_enrolled_subjects'),
('subjects', '0003_subject_semester'),
]
operations = [
migrations.RemoveField(
model_name='subject',
name='enrolled_count',
),
migrations.CreateModel(
name='SubjectStudent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('student_assigned', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='students.student')),
('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='subjects.subject')),
],
),
migrations.AddField(
model_name='subject',
name='students',
field=models.ManyToManyField(related_name='SubjectStudent_student_assigned', through='subjects.SubjectStudent', to='students.student'),
),
]

View file

@ -1,5 +1,6 @@
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
from django.utils.timezone import now
# Create your models here.
@ -15,16 +16,20 @@ class Subject(models.Model):
SECOND_SEM = 'Sem-2', '2nd Semester'
name = models.CharField(max_length=40)
enrolled_count = models.IntegerField(
default=0,
validators=[
MaxValueValidator(60),
MinValueValidator(0)
])
max_slots = models.IntegerField(default=60)
year_level = models.CharField(max_length=20, choices=YearLevels.choices)
semester = models.CharField(
max_length=20, choices=Semesters.choices, default=Semesters.FIRST_SEM)
students = models.ManyToManyField(
'students.Student', related_name='SubjectStudent_student_assigned', through='subjects.SubjectStudent')
def __str__(self):
return self.name
class SubjectStudent(models.Model):
subject = models.ForeignKey('subjects.Subject', on_delete=models.CASCADE)
student_assigned = models.ForeignKey(
'students.Student', on_delete=models.CASCADE, null=True)
date_joined = models.DateTimeField(default=now, editable=False)

View file

@ -1,13 +1,15 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Subject
from students.models import Student
class SubjectSerializer(serializers.HyperlinkedModelSerializer):
enrolled_count = serializers.IntegerField(required=False, default=0)
students = serializers.SlugRelatedField(
queryset=Student.objects.all(), many=True, slug_field='full_name', allow_null=True)
class Meta:
model = Subject
fields = ('id', 'name', 'enrolled_count',
fields = ('id', 'name', 'students',
'max_slots', 'year_level', 'semester')
read_only_fields = ('id',)