chore: Replicate Django's signature at SoftDelete queryset

This commit is contained in:
Guilherme Martins Crocetti 2024-06-06 14:38:10 -03:00
parent 2882614f0c
commit 1673feae7b
No known key found for this signature in database
GPG key ID: 150ECD17C8B180C8
3 changed files with 16 additions and 5 deletions

View file

@ -16,6 +16,7 @@ To be released
- Make `soft` argument to `SoftDeletableModel.delete()` keyword-only
- `JoinManager` and `JoinManagerMixin` have been deprecated;
please use ``JoinQueryset.as_manager()`` instead
- Change `SoftDeletableQuerySetMixin.delete` to replicate Django's API.
4.5.1 (2024-05-02)
------------------

View file

@ -363,17 +363,17 @@ class SoftDeletableQuerySetMixin(Generic[ModelT]):
its ``is_removed`` field to True.
"""
def delete(self) -> None:
def delete(self) -> tuple[int, dict[str, int]]:
"""
Soft delete objects from queryset (set their ``is_removed``
field to True)
"""
cast(QuerySet[ModelT], self).update(is_removed=True)
model: type[ModelT] = self.model # type: ignore[attr-defined]
number_of_deleted_objects = cast(QuerySet[ModelT], self).update(is_removed=True)
return number_of_deleted_objects, {model._meta.label: number_of_deleted_objects}
# Note that our delete() method does not return anything, unlike Django's.
# https://github.com/jazzband/django-model-utils/issues/541
class SoftDeletableQuerySet(SoftDeletableQuerySetMixin[ModelT], QuerySet[ModelT]): # type: ignore[misc]
class SoftDeletableQuerySet(SoftDeletableQuerySetMixin[ModelT], QuerySet[ModelT]):
pass

View file

@ -53,3 +53,13 @@ class SoftDeletableModelTests(TestCase):
def test_deprecation_warning(self) -> None:
self.assertWarns(DeprecationWarning, SoftDeletable.objects.all)
def test_delete_queryset_return(self) -> None:
SoftDeletable.available_objects.create(name='a')
SoftDeletable.available_objects.create(name='b')
result = SoftDeletable.available_objects.filter(name="a").delete()
assert result == (
1, {SoftDeletable._meta.label: 1}
)