diff --git a/ormar/protocols/queryset_protocol.py b/ormar/protocols/queryset_protocol.py index 397f58b..fe58ca1 100644 --- a/ormar/protocols/queryset_protocol.py +++ b/ormar/protocols/queryset_protocol.py @@ -26,7 +26,7 @@ class QuerySetProtocol(Protocol): # pragma: nocover async def exists(self) -> bool: ... - async def count(self) -> int: + async def count(self, distinct: bool = True) -> int: ... async def clear(self) -> int: diff --git a/ormar/queryset/queryset.py b/ormar/queryset/queryset.py index 16f9bff..0f3af12 100644 --- a/ormar/queryset/queryset.py +++ b/ormar/queryset/queryset.py @@ -682,6 +682,12 @@ class QuerySet(Generic[T]): """ Returns number of rows matching the given criteria (applied with `filter` and `exclude` if set before). + If `distinct` is `True` (the default), this will return the number of primary rows selected. If `False`, + the count will be the total number of rows returned + (including extra rows for `one-to-many` or `many-to-many` left `select_related` table joins). + `False` is the legacy (buggy) behavior for workflows that depend on it. + + :param distinct: flag if the primary table rows should be distinct or not :return: number of rows :rtype: int diff --git a/ormar/relations/querysetproxy.py b/ormar/relations/querysetproxy.py index 8170cf3..791d950 100644 --- a/ormar/relations/querysetproxy.py +++ b/ormar/relations/querysetproxy.py @@ -193,17 +193,22 @@ class QuerysetProxy(Generic[T]): """ return await self.queryset.exists() - async def count(self) -> int: + async def count(self, distinct: bool = True) -> int: """ Returns number of rows matching the given criteria (applied with `filter` and `exclude` if set before). + If `distinct` is `True` (the default), this will return the number of primary rows selected. If `False`, + the count will be the total number of rows returned + (including extra rows for `one-to-many` or `many-to-many` left `select_related` table joins). + `False` is the legacy (buggy) behavior for workflows that depend on it. Actual call delegated to QuerySet. + :param distinct: flag if the primary table rows should be distinct or not :return: number of rows :rtype: int """ - return await self.queryset.count() + return await self.queryset.count(distinct=distinct) async def max(self, columns: Union[str, List[str]]) -> Any: # noqa: A003 """