Как сериализовать поле, используя вложенные отношения с сериализатором, который также содержит вложенные отношения? - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над структурой отдыха django с записываемыми вложенными сериализаторами. Используя документацию (https://www.django -rest-framework.org / api-guide / relations / # writable-nested-serializers ), я могу создавать вложенные отношения, используя сериализатор в качестве поля.

Вот моя проблема. Я получил сообщение об ошибке ниже, когда я пытаюсь создать вложенное отношение, используя сериализатор в качестве поля, когда этот сериализатор также имеет вложенное отношение.

TypeError: прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте info_object.set ().

Вот часть моего сериализатора:

class BuildMessageSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.BuildMessageInfo
        fields = '__all__'

class BuildSerializer(serializers.ModelSerializer):

    info_object = BuildMessageSerializer(
        many=True,
        required=False,
        allow_null=True)

    class Meta:
        model = models.Build
        fields = '__all__'

    def create(self, validated_data):
        infos_result = validated_data.pop('info_object')
        build_res = models.Build.objects.create(**validated_data)
        for info_result in infos_result:
            models.BuildMessageInfo.objects.create(
                build_res=build_res,
                **info_result)
        build_res.labels.set(infos_result)
        return build_res


class JobResultSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.JobResult
        fields = '__all__'


class JobBuildResult(JobResultSerializer):

    build_result = BuildSerializer(many=True)

    def create(self, validated_data):
        builds_data = validated_data.pop('build_result')
        job_result = models.JobResult.objects.create(**validated_data)
        for build_data in builds_data:
           models.Build.objects.create(job_result=job_result,**build_data)
        return job_result

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

self.build_payload = {
    'daily_key': '365v4a9e8fv4s9efb8',
    'computer': 'SOPBAMBOO01',
    'branch_name': 'branch',
    'plan_key': 'key',
    'build_number': 25,
    'pull_request': False,
    'build_result': [
        {
            'name': 'app',
            'project': 'ble',
            'platform': 'board',
            'mode': 'release',
            'os': 'bm',
            'ide': 'iar',
            'result': 'pass',
            'warning': 0,
            'error': 0,
            'info_object': [
                {
                    'message_type': 'message',
                    'message': 'message',
                    'log_link': 'message'
                }
            ]
        }
    ]
}

Я не знаю, как справиться с этой ошибкой. Я новичок в django, и я также не понимаю, что означает ошибка, используя info_object.set ()

Спасибо за любую помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...