Как создать сериализатор и представление для создания подкатегории в django и djangorestframework

#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.