[{"non Field errors": ["ожидаемый список элементов."]}] при сохранении данных в Django Rest с MongoDB
Я новичок в Джанго. Я пытаюсь сохранить данные json с помощью Django. Я использую MongoDB в качестве бэкенда и один ко многим отношениям подход для хранения данных - http://docs.mongodb.org/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/
Вот моя модель:
class OtherInfo(models.Model):
info_1 = models.CharField(max_length=200)
info_2 = models.CharField(max_length=200)
info_3 = models.CharField(max_length=200)
def __unicode__(self):
return u'%s %s %s' % (self.info_1, self.info_2, self.info_3)
class ModelInfo(models.Model):
name = models.CharField(max_length=200)
email = models.CharField(max_length=200)
other_info = ListField(EmbeddedModelField(OtherInfo))
def __unicode__(self):
return u'%s %s' % (self.name, self.email)
Проблема -
@api_view(['GET', 'PUT', 'POST'])
def save(request, format=None):
serializer = mySerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Сериализатор -
class other_info_serializer(serializers.ModelSerializer):
class Meta:
model = OtherInfo
fields = ('info_1', 'info_2', 'info_3')
class mySerializer(serializers.ModelSerializer):
other_info=other_info_serializer(many=True)
class Meta:
model = ModelInfo
fields = ('name', 'email','other_info')
Я хочу, чтобы эта информация была сохранена, как показано ниже, в DB
{
_id: "joe",
name: "Joe Bookreader",
email: "[email protected]",
other_info: [
{
info_1 : "123 Fake Street",
info_2: "Faketon",
},
{
info_1: "1 Some Other Street",
info_2: "Boston",
}
]
}
Теперь, когда я отправляю данные post в URL
http://127.0.0.1:8080/save/
Parameter 1 : "name":"sample name"
Parameter 2 : "email":"[email protected]"
Parameter 3 : [{'info_1':'Google','info_2':'Save'},{'info_1':'Hackhathon','info_2':'Present'}]
При выполнении вышеуказанного запроса я получаю -
{"other_info": [{"non_field_errors": ["Expected a list of items."]}]}
Какие-нибудь предложения по поводу того, что происходит неправильно ?
Edit
Также попытался передать пару значений имени. Но все тот же вопрос.
Parameter 3 : "other_info" : [{'info_1':'Google','info_2':'Save'},{'info_1':'Hackhathon','info_2':'Present'}]
2 ответов:
Эта проблема вызвана
RelationsList- у него нет собственной функцииsave, но Родительский сериализатор вызвал ее.Существует точно такая же проблема на GitHub issue. И они говорят, что обработка вложенных объектов все еще находится на стадии интенсивной разработки. (Ссылка )
Но я сделал патч для этого(как показано ниже), и вы можете протестировать его через образец проекта.
class RelationsList(list): _deleted = [] def save(self, **kwargs): [obj.save(**kwargs) for obj in self]
MongoDB всегда ожидает пару имя-значение, и вы не указываете ее в третьем параметре:
Parameter 3 : [{'info_1':'Google','info_2':'Save'},{'info_1':'Hackhathon','info_2':'Present'}]Здесь вы передаете только массив объектов. Ваша просьба должна выглядеть так:
Parameter 3 : "other_info" : [{'info_1':'Google','info_2':'Save'},{'info_1':'Hackhathon','info_2':'Present'}]
Comments