Django Rest Framwork : Вложенные объекты в одном сериализаторе

У меня ситуация с двойным вложенным сериализатором... У меня есть три модели: Reports, ReportPages и widgets, при попытке создать определенный endpoind, который является :

payload {
    "since_date": "some date",
    "until_date": "some other date that is greater than since_date",
    "report_pages": [
        {
            "page_number": "some number" (generated from front end, of type integer)
            "widgets": [
                {
                    "data": ["some array"],
                    "width": "some number",
                    "height": "some number",
                    "top_position": "some number",
                    "left_position": "some number",
                    "widget_type": "" (either "Label", "LineChart", "Bar" or "PieChart"),
                }
            ]
        }
    ]
}

У меня возникла проблема с вложенным сериализатором, я смог создать только первую половину, а именно :

payload {
    "since_date": "some date",
    "until_date": "some other date that is greater than since_date",
    "report_pages": [
        {
            "page_number": "some number" (generated from front end, of type integer)
          ]
        }

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

Report{
 report_page{
  widgets {}
 }
}

Мои модели :

class Reports(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=500, null=True)
    since_date = models.DateTimeField(null=True)
    until_date = models.DateTimeField(null=True)
    def __str__(self):
        return self.name

class ReportPages(models.Model):
    id = models.AutoField(primary_key=True)
    number = models.IntegerField(null=True)
    report = models.ForeignKey(Reports, related_name="report_pages",on_delete=models.CASCADE)
    def __str__(self):
        return self.number

class Widgets(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    data = ArrayField(models.CharField(max_length=10, blank=True))
    width = models.IntegerField(null=True) 
    height = models.IntegerField(null=True)
    top_position = models.FloatField(null=True) 
    left_position = models.FloatField(null=True) 
    widget_type = models.CharField(max_length=500, null=True)
    report_pages = models.ForeignKey(ReportPages,related_name="widgets", on_delete=models.CASCADE)

Мои взгляды :

class Reports2ViewSet(viewsets.ModelViewSet):

    queryset = Reports.objects.all()
    serializer_class = Reports2Serializer

    http_method_names = ['get','post','retrieve','put','patch']

Мои сериализаторы :

class ReportWidgetsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Widgets
        fields = '__all__'

class ReportPagesSerializer(serializers.ModelSerializer):
    widgets = ReportWidgetsSerializer(many=True)
    class Meta:
        model = ReportPages
        fields = ('number','widgets',)
    def update(self, instance, validated_data):
        return super().update(instance, validated_data)
class Reports2Serializer(serializers.ModelSerializer):
    report_pages = ReportPagesSerializer(many=True)
    class Meta:
        model = Reports
        fields = ('report_pages','since_date','until_date',)
      
    def update(self, instance, validated_data):
      page_list = validated_data.pop('report_pages')
      instance.since_date = validated_data.get('since_date', instance.since_date)
      instance.until_date = validated_data.get('until_date', instance.until_date)
      instance.save()
      
      # print(widget_list)
      #raise serializers.ValidationError("error")
      serializer = self.fields['report_pages']
      serializer1 =ReportPagesSerializer.fields['widgets']
      for page in page_list:
        page['report'] = instance
        widget_list = page.get('widgets')
        
        for widget in widget_list:
          widget['report_pages'] = page['id']
        widjets = serializer1.create(widget_list)
      pages = serializer.create(page_list)

      return instance

ошибка :

{
    "report_pages": [
        {
            "widgets": [
                {
                    "report_pages": [
                        "This field is required."
                    ]
                }
            ]
        },
        {
            "widgets": [
                {
                    "report_pages": [
                        "This field is required."
                    ]
                }
            ]
        }
    ]
}
Вернуться на верх