У меня есть вложенный 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.
Как мне это сделать? Что я делаю не так?
я могу, но это, кажется, как взломать и он обходит шаг проверки, который, я думаю, означает, что я должен был бы написать свой собственный валидатор. Я подумал, что будет более формальный способ обработки связывания уже существующего объекта с помощью сериализатора – Seaux
@Seaux Измените код, чтобы принять подтвержденные данные. Для вложенных сериализаторов у нас есть два подхода: создать экземпляр на уровне сериализатора или уровне представления, используя методы создания и обновления. –