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."
]
}
]
}
]
}