2015-09-18 1 views
1

У меня есть вложенный ModelSerializer, что у меня проблемы с проверкой.Django Rest Framework Вложенный сериализатор Существующий экземпляр

Проблема, с которой я столкнулся, заключается в том, что при создании родительского сериализатора я могу или не обязательно создавать вложенный сериализатор/модель, поскольку он может уже существовать в базе данных, и я просто хочу связать его. Настройка

Код:

models.py

class ModelA(models.Model): 
    modelb = ForeignKey(ModelB, null=true, blank=true) 
    ... 

class ModelB(models.Model): 
    ... 

serializers.py

class ModelASerializer(serializers.ModelSerializer): 
    modelb = ModelBSerializer(required=False) 

    class Meta: 
     model = ModelA 
     depth = 1 

class ModelBSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ModelB 

Таким образом, учитывая 3 сценария данных впадаю в ошибки проверки на всех 3.

Во-первых, если я передаю NestedModel в качестве данных, например

data = { 
    'nestedmodel': NestedModel(**args), 
    ... 
} 

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

Во-вторых, если я передать данные NestedModel (вместо объекта):

data = { 
    'nestedmodel': {'id': 'this', ... }, 
} 

Я получаю эквивалент ошибки проверки дубликата ключа, поскольку Уплотненный модель имеет уникальный ключ («ID») и уже существует в базе данных.

И, в-третьих, если я просто передаю ему идентификатор вложенной модели, я получаю аналогичную ошибку для первой ситуации, кроме того, что она говорит, что она получила Unicode вместо экземпляра NestedModel.

data = { 
    'nestedmodel': 'this', 
} 

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

Как мне это сделать? Что я делаю не так?

ответ

1

Вы можете попробовать это:

serializers.py

class ModelASerializer(serializers.ModelSerializer): 
    modelb = ModelBSerializer(required=False) 

    class Meta: 
     model = ModelA 
     depth = 1 
     fields = ('id', 'modelb',) 

    def create(self, validated_data): 
     modelb_id = self.validated_data.pop("nestedmodel") 
     modelb = ModelB.objects.get(id=modelb_id["id"]) 
     modela = ModelA.objects.create(modelb=modelb, **validated_data) 
     return modela 

Передайте данные следующим образом:

Входной

data = {"nestedmodel": {"id": 1 # add nestedmodel fields here}, } 
+1

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

+0

@Seaux Измените код, чтобы принять подтвержденные данные. Для вложенных сериализаторов у нас есть два подхода: создать экземпляр на уровне сериализатора или уровне представления, используя методы создания и обновления. –

 Смежные вопросы

  • Нет связанных вопросов^_^