Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ Reverses the order in which a queryset’s elements are returned.
Returns a random object matched by the queryset, or `None`
if there is no matching object.

##### [](#header-5)random_queryset(maximum: int = None)

Returns a random objects matched by the queryset.

##### [](#header-5)none()

Returns instance of an `EmptyQuerySet`.
Expand Down Expand Up @@ -377,4 +381,4 @@ Case-insensitive ends-with.

##### [](#header-5)isnone

Checks if the value is equal to Python `NoneType`.
Checks if the value is equal to Python `NoneType`.
9 changes: 8 additions & 1 deletion reobject/query/queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,13 @@ def random(self) -> Maybe['Model']: # type: ignore
else:
return obj

def random_queryset(self, maximum: int = None) -> 'QuerySet':
_max = maximum or self.count()
return type(self)(
random.sample(self, _max),
model=self.model
)

def reverse(self) -> 'QuerySet':
return type(self)(
reversed(self),
Expand All @@ -190,7 +197,7 @@ def values(self, *fields: Fields) -> 'QuerySet':
model=self.model
)

def values_list(self, *fields: Fields, flat: bool=False) -> 'QuerySet':
def values_list(self, *fields: Fields, flat: bool = False) -> 'QuerySet':
# TODO: Allow order_by on values_list

if not fields:
Expand Down
10 changes: 9 additions & 1 deletion tests/unit/test_queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,14 @@ def test_manager_random(self):

self.assertIn(obj, SomeModel.objects.all())

def test_manager_random_queryset(self):
SomeModel(p='foo', q=1)
SomeModel(p='bar', q=2)

objs = SomeModel.objects.random_queryset()
for obj in objs:
self.assertIn(obj, SomeModel.objects.all())

def test_manager_map(self):
SomeModel(p='foo', q=1)
SomeModel(p='bar', q=2)
Expand All @@ -383,4 +391,4 @@ def test_manager_map_non_callable(self):
SomeModel(p='bar', q=2)

with self.assertRaises(TypeError):
result = SomeModel.objects.map(func=1)
result = SomeModel.objects.map(func=1)