doableware / djongo

Django and MongoDB database connector
https://www.djongomapper.com
GNU Affero General Public License v3.0
1.87k stars 353 forks source link

Bulk update doesn't work #379

Open tiholic opened 4 years ago

tiholic commented 4 years ago

One line description of the issue

Django 2.2 supports bulk update which doesn't work with Djongo https://docs.djangoproject.com/en/2.2/ref/models/querysets/#bulk-update

Python script

```python >>> from watchman.models.indicators import IPIndicator >>> IPIndicator >>> ips = IPIndicator.objects.all()[:3] >>> ips , , ]> >>> for ip in ips: >>> ip.tags = ['axsa'] >>> >>> IPIndicator.objects.bulk_update(ips, ['tags']) ``` #### Traceback ``` Traceback (most recent call last): File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 769, in parse return handler(self, statement) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 887, in _update self._query = UpdateQuery(self.db, self.connection_properties, sm, self._params) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 312, in __init__ super().__init__(*args) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 74, in __init__ self.parse() File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 328, in parse c = self.set_columns = SetConverter(self, tok_id) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/converters.py", line 328, in __init__ super().__init__(*args) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/converters.py", line 24, in __init__ self.parse() File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/converters.py", line 341, in parse raise SQLDecodeError djongo.sql2mongo.SQLDecodeError The above exception was the direct cause of the following exception: Traceback (most recent call last): File "", line 1, in File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/models/query.py", line 525, in bulk_update self.filter(pk__in=pks).update(**update_kwargs) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/models/query.py", line 741, in update rows = query.get_compiler(self.db).execute_sql(CURSOR) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1426, in execute_sql cursor = super().execute_sql(result_type) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1097, in execute_sql cursor.execute(sql, params) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/backends/utils.py", line 99, in execute return super().execute(sql, params) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers return executor(sql, params, many, context) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute return self.cursor.execute(sql, params) File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/cursor.py", line 48, in execute self.result = Result( File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 706, in __init__ self.parse() File "/Users/rohit/workspace/venvs/bc_cms/lib/python3.8/site-packages/djongo/sql2mongo/query.py", line 789, in parse raise exe from e djongo.sql2mongo.SQLDecodeError: FAILED SQL: UPDATE "watchman_ipindicator" SET "tags" = CASE WHEN ("watchman_ipindicator"."_id" = %(0)s) THEN %(1)s WHEN ("watchman_ipindicator"."_id" = %(2)s) THEN %(3)s WHEN ("watchman_ipindicator"."_id" = %(4)s) THEN %(5)s ELSE NULL END WHERE "watchman_ipindicator"."_id" IN (%(6)s, %(7)s, %(8)s) Version: 1.2.31 ```
bang6777 commented 1 year ago

I am facing similar errors. Do you have any solution to bulk_update multiple fields for djongo==1.3.6 django == 2.2