diff options
| author | Jon Janzen <jon@jonjanzen.com> | 2022-11-03 19:57:33 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-11-09 10:32:40 +0100 |
| commit | 321ecb40f4da842926e1bc07e11df4aabe53ca4b (patch) | |
| tree | 3a306ec0bc38c90eb95d8adceaecc3017e1b3d06 /django | |
| parent | 41e8931c2cc68d8b2de4219be930e2c305b4eba1 (diff) | |
Fixed #34135 -- Added async-compatible interface to related managers.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/contenttypes/fields.py | 20 | ||||
| -rw-r--r-- | django/db/models/fields/related_descriptors.py | 44 |
2 files changed, 64 insertions, 0 deletions
diff --git a/django/contrib/contenttypes/fields.py b/django/contrib/contenttypes/fields.py index ce2a096cc2..72b9e7631a 100644 --- a/django/contrib/contenttypes/fields.py +++ b/django/contrib/contenttypes/fields.py @@ -689,6 +689,11 @@ def create_generic_related_manager(superclass, rel): add.alters_data = True + async def aadd(self, *objs, bulk=True): + return await sync_to_async(self.add)(*objs, bulk=bulk) + + aadd.alters_data = True + def remove(self, *objs, bulk=True): if not objs: return @@ -696,11 +701,21 @@ def create_generic_related_manager(superclass, rel): remove.alters_data = True + async def aremove(self, *objs, bulk=True): + return await sync_to_async(self.remove)(*objs, bulk=bulk) + + aremove.alters_data = True + def clear(self, *, bulk=True): self._clear(self, bulk) clear.alters_data = True + async def aclear(self, *, bulk=True): + return await sync_to_async(self.clear)(bulk=bulk) + + aclear.alters_data = True + def _clear(self, queryset, bulk): self._remove_prefetched_objects() db = router.db_for_write(self.model, instance=self.instance) @@ -740,6 +755,11 @@ def create_generic_related_manager(superclass, rel): set.alters_data = True + async def aset(self, objs, *, bulk=True, clear=False): + return await sync_to_async(self.set)(objs, bulk=bulk, clear=clear) + + aset.alters_data = True + def create(self, **kwargs): self._remove_prefetched_objects() kwargs[self.content_type_field_name] = self.content_type diff --git a/django/db/models/fields/related_descriptors.py b/django/db/models/fields/related_descriptors.py index f1c8a73f49..422b08e6ca 100644 --- a/django/db/models/fields/related_descriptors.py +++ b/django/db/models/fields/related_descriptors.py @@ -787,6 +787,11 @@ def create_reverse_many_to_one_manager(superclass, rel): add.alters_data = True + async def aadd(self, *objs, bulk=True): + return await sync_to_async(self.add)(*objs, bulk=bulk) + + aadd.alters_data = True + def create(self, **kwargs): self._check_fk_val() kwargs[self.field.name] = self.instance @@ -856,12 +861,22 @@ def create_reverse_many_to_one_manager(superclass, rel): remove.alters_data = True + async def aremove(self, *objs, bulk=True): + return await sync_to_async(self.remove)(*objs, bulk=bulk) + + aremove.alters_data = True + def clear(self, *, bulk=True): self._check_fk_val() self._clear(self, bulk) clear.alters_data = True + async def aclear(self, *, bulk=True): + return await sync_to_async(self.clear)(bulk=bulk) + + aclear.alters_data = True + def _clear(self, queryset, bulk): self._remove_prefetched_objects() db = router.db_for_write(self.model, instance=self.instance) @@ -905,6 +920,11 @@ def create_reverse_many_to_one_manager(superclass, rel): set.alters_data = True + async def aset(self, objs, *, bulk=True, clear=False): + return await sync_to_async(self.set)(objs=objs, bulk=bulk, clear=clear) + + aset.alters_data = True + return RelatedManager @@ -1132,12 +1152,24 @@ def create_forward_many_to_many_manager(superclass, rel, reverse): add.alters_data = True + async def aadd(self, *objs, through_defaults=None): + return await sync_to_async(self.add)( + *objs, through_defaults=through_defaults + ) + + aadd.alters_data = True + def remove(self, *objs): self._remove_prefetched_objects() self._remove_items(self.source_field_name, self.target_field_name, *objs) remove.alters_data = True + async def aremove(self, *objs): + return await sync_to_async(self.remove)(*objs) + + aremove.alters_data = True + def clear(self): db = router.db_for_write(self.through, instance=self.instance) with transaction.atomic(using=db, savepoint=False): @@ -1166,6 +1198,11 @@ def create_forward_many_to_many_manager(superclass, rel, reverse): clear.alters_data = True + async def aclear(self): + return await sync_to_async(self.clear)() + + aclear.alters_data = True + def set(self, objs, *, clear=False, through_defaults=None): # Force evaluation of `objs` in case it's a queryset whose value # could be affected by `manager.clear()`. Refs #19816. @@ -1200,6 +1237,13 @@ def create_forward_many_to_many_manager(superclass, rel, reverse): set.alters_data = True + async def aset(self, objs, *, clear=False, through_defaults=None): + return await sync_to_async(self.set)( + objs=objs, clear=clear, through_defaults=through_defaults + ) + + aset.alters_data = True + def create(self, *, through_defaults=None, **kwargs): db = router.db_for_write(self.instance.__class__, instance=self.instance) new_obj = super(ManyRelatedManager, self.db_manager(db)).create(**kwargs) |
