Обновление вложенного экземпляра DRF содержит пустые данные validated_data - PullRequest
0 голосов
/ 02 ноября 2019

Я использую 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...