#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я создал три класса 1. Программа — родитель — пример бакалавра искусств (BA) 2. Семестр — потомок — первый семестр — потомок программы 3. Курс — старший потомок — Химия-1, потомок семестра
Подробно: 1) В рамках программы будет много семестров, ссылка с использованием внешнего ключа 2) В рамках семестра будет много курсов.
Как реализовать это поведение в djangorestframework. 1) Создать курс в рамках семестра 2) перечислить все курсы в рамках программы и семестра
class Programme(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Semester(models.Model):
name = models.CharField(max_length=100)
numeric = models.IntegerField()
programme = models.ForeignKey(Programme,
on_delete=models.CASCADE)
def __str__(self):
return self.name
class Course(models.Model):
name = models.CharField(max_length=200)
code = models.CharField(max_length=200)
semester = models.ForeignKey(Semester,
on_delete=models.CASCADE,related_name='courses')
internal = models.IntegerField()
external = models.IntegerField()
total = models.IntegerField()
def __str__(self):
return self.name
Комментарии:
1. Можете ли вы поделиться тем, что вы уже пробовали, возможно, представлениями DRF, классами сериализатора, которые вы определили?
Ответ №1:
вам нужно будет использовать method field в serializer to и добавить его в качестве exptra поля в class meta, чтобы получить полный список и подкатегорию:
serializer.py
class courseserializer(serializers.ModelSerializer):
class Meta:
model = course
fields = '__all__'
class semesterserilizer(serializers.ModelSerializer):
course=serializers.SerializerMethodField()
class Meta:
model = course
fields = ['name','course']
def get_course(self,obj):
queryset=course.objects.filter(id=obj.id)
return courseserializer(queryset,many=True).data
то же самое вам нужно будет сделать с program, чтобы получить как serilaizer внутри программы, так и в view, передает набор запросов в родительский serilizer, который будет извлекать соответствующие данные, как мы указали в serilizer.