From 5268bf56dd3eada150594724aa3ceb6c9e1cd123 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 25 Sep 2019 12:14:58 +0200 Subject: [PATCH 1/4] Add kwargs into insert method #2169 --- docs/changelog.rst | 1 + mongoengine/queryset/base.py | 9 +++++++-- tests/queryset/test_queryset.py | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) 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..7963c45a8 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 @@ -323,6 +324,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 +350,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..257c20ea4 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -945,6 +945,9 @@ class Blog(Document): Blog.objects.insert(Blog(title=blog2.title)) self.assertEqual(Blog.objects.count(), 2) + # pass ordered=False + Blog.drop_collection() + Blog.objects.insert([blog1, blog2], ordered=False) def test_bulk_insert_different_class_fails(self): class Blog(Document): From 4460e511685c17cba4e4a8e40f031e505a608804 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Wed, 25 Sep 2019 12:24:04 +0200 Subject: [PATCH 2/4] Fix tests --- tests/queryset/test_queryset.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index 257c20ea4..66b13de3b 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -947,7 +947,10 @@ class Blog(Document): self.assertEqual(Blog.objects.count(), 2) # pass ordered=False Blog.drop_collection() - Blog.objects.insert([blog1, blog2], ordered=False) + Blog.objects.insert([ + Blog(title="foo", posts=[post1, post2]), + Blog(title="bar", posts=[post2, post3]) + ], ordered=False) def test_bulk_insert_different_class_fails(self): class Blog(Document): From 68695ce3aecfcd2f42a4c3baa27c6c9743a7da89 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Thu, 26 Sep 2019 08:24:22 +0200 Subject: [PATCH 3/4] Fix feedback --- mongoengine/queryset/base.py | 5 ++++- tests/queryset/test_queryset.py | 10 +++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 7963c45a8..fe345c896 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -303,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`` diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index 66b13de3b..9c9f398b9 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -945,8 +945,16 @@ class Blog(Document): Blog.objects.insert(Blog(title=blog2.title)) self.assertEqual(Blog.objects.count(), 2) - # pass ordered=False + + def test_bulk_insert_with_kwargs(self): + class Blog(Document): + title = StringField(unique=True) + tags = ListField(StringField()) + posts = ListField(EmbeddedDocumentField(Post)) + Blog.drop_collection() + + # pass ordered=False Blog.objects.insert([ Blog(title="foo", posts=[post1, post2]), Blog(title="bar", posts=[post2, post3]) From eaf65ca7181382931adf1f8583eef0cf63d5caf9 Mon Sep 17 00:00:00 2001 From: Erdenezul Batmunkh Date: Thu, 26 Sep 2019 08:40:30 +0200 Subject: [PATCH 4/4] Fix test --- tests/queryset/test_queryset.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index 9c9f398b9..8a243292c 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -950,14 +950,13 @@ def test_bulk_insert_with_kwargs(self): class Blog(Document): title = StringField(unique=True) tags = ListField(StringField()) - posts = ListField(EmbeddedDocumentField(Post)) Blog.drop_collection() # pass ordered=False Blog.objects.insert([ - Blog(title="foo", posts=[post1, post2]), - Blog(title="bar", posts=[post2, post3]) + Blog(title="foo", tags=["A", "B"]), + Blog(title="bar", posts=["C", "D"]) ], ordered=False) def test_bulk_insert_different_class_fails(self):