如何在Django REST Framework Mongoengine中序列化EmbeddedDocumentListField?

pko*_*out 5 django django-rest-framework

我在请求正文中发送了一个带有以下内容的API发布请求(转换为JSON字符串),以便序列化为BookCollection文档,并将图书保存为嵌入文档列表:

{
    'author': '<author_id>',
    'books': [
        {
            'title': 'Grapes of Wrath',
            'note': 'More to be ordered.',
            'created': '2016-03-11T17:59:01.054Z'
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

views.py:

def post(self, request, *args, **kwargs):
    serializer = BookCollectionSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors,
                    status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

models.py:

class Book(EmbeddedDocument):
    title = StringField(required=True, max_length=50)
    note = StringField(required=False, max_length=2000)
    created = DateTimeField(required=True,
                            default=datetime.datetime.now())


class BookCollection(Document):
    author = ReferenceField(Author, required=True)
    books = EmbeddedDocumentListField(Book, required=False)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class BookSerializer(EmbeddedDocumentSerializer):

    class Meta:
        model = Book
        depth = 2


class BookCollectionSerializer(DocumentSerializer):
    author = ReferenceField(Author)
    books = BookSerializer(Book, many=True)

    class Meta:
        model = BookCollection
        depth = 2

    def create(self, validated_data):
        books = validated_data.pop('books')
        book_collection = BookCollection.objects.create(**validated_data)
        book_collection.books = []
        for book in books:
            book_collection.books.append(book)
        book_collection.save()
        return book_collection
Run Code Online (Sandbox Code Playgroud)

当我运行post请求时,BookCollection对象确实被持久化; 但是,BooksCollection中不会保留书籍列表(嵌入文档列表).它只是设置为空白列表[].我在这做错了什么?我也尝试从create()方法中删除逻辑,但这没有帮助.谢谢!

pko*_*out 0

我发现了问题所在——这是一个愚蠢的错误。我没有将 API post 请求内容类型设置为 application/json。一旦我设置了它,它就完美地工作了。