mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #34135 -- Added async-compatible interface to related managers.
This commit is contained in:
committed by
Mariusz Felisiak
parent
41e8931c2c
commit
321ecb40f4
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user