2015-08-05 2 views
0

Все работает отлично до тех пор, пока значение ReferenceField не будет ссылаться на действительный документ. Затем в качестве значения остается значение ObjectID, а json не знает, как сериализовать это.Mongoengine Django Rest Framework - Ошибка Serializer - ReferenceField не является сериализуемым JSON

Как справиться с недействительными ссылочными полями?

E.g.

class Food(Document): 
    name = StringField() 
    owner = ReferenceField("Person") 

class Person(Document): 
    first_name = StringField() 
    last_name = StringField() 
    ... 


p = Person(...) 
apple = Food(name="apple", owner=p) 
p.delete() # might be the wrong method, but you get the idea 

В этот момент, пытаясь извлечь список продуктов через REST API будет завершаться с ошибкой is not JSON serializable, так как apple.owner больше не указывает на владельца, который существует.

+0

Вы также пользуетесь 'django-rest-framework-mongoengine'? –

ответ

1

Поскольку вы используете DRF с mongoengine, вы должны использовать django-rest-framework-mongoengine.

Очевидно, это ошибка в django-rest-framework-mongoengine. Проверьте эту открытую проблему в Github, о которой недавно сообщалось относительно того же.

https://github.com/umutbozkurt/django-rest-framework-mongoengine/issues/91

Один из способов, чтобы написать свой собственный JSONEncoder для этого. Это может помочь link.

Другой вариант - использовать библиотеку json_utilPymongo. Они обеспечивают явное преобразование BSON в json и из него.

По json-util документы:

Этот модуль предоставляет два вспомогательных методов dumps и loads обёртки на нативные методы JSon и обеспечивают явное преобразование BSON и из JSON. Это позволяет специализированное кодирование и декодирование документов BSON в строгом режиме Mongo Extended JSON. Это позволяет кодировать /декодировать документы BSON в JSON, даже если они используют специальные типы BSON.

+0

hrmm, спасибо, что указали это. –

+0

Создание собственного 'JSONEncoder' может помочь. Проверьте это. http://stackoverflow.com/a/16586277/4921103 –

+0

Хммм, я посмотрю на это. Благодаря! –

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