Моноинженерный сериализованный словарь (с вложенными диктовками)?
Я создал словарь из загруженного файла в Django.
Этот словарь имеет вложенный список словарей:
file = {"name": "filename", "sections": [{"section_name": "string", "lines": [{line_number: 0, "line"; "data"}]}], "etc": "etc"}
Модель также представляет глубину словарей.
class Line(EmbeddedDocument):
line_number = IntField()
line = StringField()
definition = ReferenceField(Definition)
class Section(EmbeddedDocument):
section_name = StringField()
lines = EmbeddedDocumentListField(Line))
class File(Document):
name = StringField()
sections = EmbeddedDocumentListField(Section))
created_on = DateTimeField()
created_by = StringField()
modified_on = DateTimeField()
modified_by = StringField()
В POST у меня есть следующее, чтобы расколоть файл в вышеупомянутый Dict (файл является простым текстовым файлом):
file= {}
with open(os.path.join(path, filename + ".txt"), 'r') as temp_file:
filelines = temp_file.readlines()
sections = []
section = {}
lines = []
for i, l in enumerate(filelines):
if i == 0:
section["section_name"] = "Top"
elif '*' in l:
if l.index('*') == 0 and '*' not in lines[len(lines) - 2"line"]:
section["lines"] = lines
lines = []
sections.append(section)
section = dict()
section["section_name"] = filelines[i + 1][1:-2]
line = {"line_number": i + 1, "line": l}
lines.append(line)
section['lines'] = lines
sections.append(section)
file["name"] = filename
file["sections"] = sections
Я уберу это в конце концов. Как только дикт сделан, как мне сериализовать его с помощью сериализатора?
Можно ли вставить это в сериализатор?
Если нет, то как я могу получить все это в базу данных с проверкой?
я пробовал json.dumps()
а также JsonRequst()
затем положить их в data=
для сериализатора, но получить Unable to get repr for <class '....'>
Я довольно новичок в Django и MongoDB, поэтому, если вам нужна дополнительная информация, я могу предоставить:)
Спасибо!
Обновить
Измените список полей модели на EmbeddedDocumentListField, как предлагается в ответе.
Ответил
Благодаря предложению Бориса, приведенному ниже, это указало мне на ошибку, которую я изначально не получал. У меня была опечатка и передача диктата прямо в FileSerializer(data=file)
работает как шарм!:)
1 ответ
Джеймс!
Самый простой способ проверить, что ваши входящие файлы JSON соответствуют указанной вами схеме Mongoengine Documents, - это использовать DRF-Mongoengine's DocumentSerializer
,
По сути, вам нужно создать сериализатор
serializers.py
import rest_framework_mongoengine
class FileSerializer(rest_framework_mongoengine.DocumentSerializer):
class Meta:
fields = '__all__'
model = File
Затем вам нужно представление или набор представлений, который использует этот сериализатор для ответа на запросы GET/POST/PUT/DELETE.
views.py
from rest_framework_mongoengine import viewsets
class FileViewSet(viewsets.ModelViewSet):
lookup_field = 'id'
serializer_class = FileSerializer
def get_queryset(self):
return File.objects.all()
и зарегистрируйте этот набор с помощью роутера
urls.py
from rest_framework import routers
# this is DRF router for REST API viewsets
router = routers.DefaultRouter()
# register REST API endpoints with DRF router
router.register(r'file', FileViewSet, r"file")
Я также рекомендую использовать EmbeddedDocumentListField
вместо ListField(EmbeddedDocumentField(Section))
- у него есть дополнительные методы.