Моноинженерный сериализованный словарь (с вложенными диктовками)?

Я создал словарь из загруженного файла в 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)) - у него есть дополнительные методы.

Другие вопросы по тегам