Я использую Django 2.x и DRF .
У меня есть две модели
class Component(Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100, default='Unnamed')
group = models.ForeignKey(AnalyticsGroup, on_delete=models.CASCADE)
class ComponentData(Model):
component = models.ForeignKey(Component, on_delete=models.CASCADE, related_name='data')
analytics_type = models.ForeignKey(AnalyticsType, on_delete=models.PROTECT)
Пользователь может создавать / обновлять ComponentData объект, использующий Component сериализатор, и для этого у меня есть
class ComponentDataSerializer(serializers.ModelSerializer):
class Meta:
model = ComponentData
fields = [
'id',
'analytics_type',
]
class ComponentSerializer(serializers.ModelSerializer):
data = ComponentDataSerializer(many=True)
class Meta:
model = Component
fields = [
'name',
'group',
]
def create(self, validated_data):
component_data = validated_data.pop('data')
component = Component.objects.create(**validated_data)
for data in component_data:
ComponentData.objects.create(component=component, **data)
return component
def update(self, instance, validated_data):
component_data = validated_data.pop('data')
# Update instance
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()
# Update or create component data
for data in component_data:
# data.items() has no data and prints
# Updating with data: odict_items([])
print('Updating with data: {}'.format(data.items()))
return instance
def to_representation(self, instance):
response = super().to_representation(instance)
response['group'] = AnalyticsGroupSerializer(instance=instance.group).data
return response
У меня есть переопределенные методы create
и update
для создания вложенных объектов. create
работает нормально, но с методом update
в поле validated_data.pop('data')
есть объекты OrderedDict()
, но в объекте OrderedDict нет данных.
В теле запроса есть данные:
group: "2"
data[0].id: "1"
data[0].analytics_type: "2"