diff --git a/docs/changelog.rst b/docs/changelog.rst index 5422f113d..11ee9ef09 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -19,6 +19,7 @@ Development - ``ListField`` now accepts an optional ``max_length`` parameter. #2110 - The codebase is now formatted using ``black``. #2109 - In bulk write insert, the detailed error message would raise in exception. +- ``Doc.objects.insert`` accepts kwargs to pass ``ordered``, ``bypass_document_validation``, etc. #2169 Changes in 0.18.2 ================= diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index cde06d542..fe345c896 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -288,7 +288,8 @@ def first(self): return result def insert( - self, doc_or_docs, load_bulk=True, write_concern=None, signal_kwargs=None + self, doc_or_docs, load_bulk=True, write_concern=None, signal_kwargs=None, + **kwargs ): """bulk insert documents @@ -302,8 +303,11 @@ def insert( ``insert(..., {w: 2, fsync: True})`` will wait until at least two servers have recorded the write and will force an fsync on each server being written to. - :parm signal_kwargs: (optional) kwargs dictionary to be passed to + :param signal_kwargs: (optional) kwargs dictionary to be passed to the signal calls. + :param kwargs: (optional) kwargs dictionary to be forwarded to + the pymongo's insert method. For example, + ``Document.objects.insert(docs, ordered=False)`` By default returns document instances, set ``load_bulk`` to False to return just ``ObjectIds`` @@ -323,6 +327,10 @@ def insert( return_one = True docs = [docs] + if return_one and 'ordered' in kwargs: + # insert_one does not accept `ordered` argument + kwargs.pop('ordered') + for doc in docs: if not isinstance(doc, self._document): msg = "Some documents inserted aren't instances of %s" % str( @@ -345,7 +353,7 @@ def insert( insert_func = collection.insert_one try: - inserted_result = insert_func(raw) + inserted_result = insert_func(raw, **kwargs) ids = ( [inserted_result.inserted_id] if return_one diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index e7e59905d..8a243292c 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -946,6 +946,19 @@ class Blog(Document): self.assertEqual(Blog.objects.count(), 2) + def test_bulk_insert_with_kwargs(self): + class Blog(Document): + title = StringField(unique=True) + tags = ListField(StringField()) + + Blog.drop_collection() + + # pass ordered=False + Blog.objects.insert([ + Blog(title="foo", tags=["A", "B"]), + Blog(title="bar", posts=["C", "D"]) + ], ordered=False) + def test_bulk_insert_different_class_fails(self): class Blog(Document): pass