Skip to content

Commit 8beef47

Browse files
committed
Merge pull request #2862 from ticosax/allow-empty-queryset
Prevent empty `queryset`s to raise AssertionError.
2 parents fe7cd84 + 24e9473 commit 8beef47

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

rest_framework/permissions.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ def has_permission(self, request, view):
120120
if queryset is None and getattr(view, '_ignore_model_permissions', False):
121121
return True
122122

123-
assert queryset, (
123+
assert queryset is not None, (
124124
'Cannot apply DjangoModelPermissions on a view that '
125-
'does not have `.queryset` property.'
125+
'does not have `.queryset` property nor redefines `.get_queryset()`.'
126126
)
127127

128128
perms = self.get_required_permissions(request.method, queryset.model)

tests/test_permissions.py

+13
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,17 @@ def get_queryset(self):
4141
return BasicModel.objects.all()
4242

4343

44+
class EmptyListView(generics.ListCreateAPIView):
45+
queryset = BasicModel.objects.none()
46+
serializer_class = BasicSerializer
47+
authentication_classes = [authentication.BasicAuthentication]
48+
permission_classes = [permissions.DjangoModelPermissions]
49+
50+
4451
root_view = RootView.as_view()
4552
instance_view = InstanceView.as_view()
4653
get_queryset_list_view = GetQuerySetListView.as_view()
54+
empty_list_view = EmptyListView.as_view()
4755

4856

4957
def basic_auth_header(username, password):
@@ -166,6 +174,11 @@ def test_options_updateonly(self):
166174
self.assertIn('actions', response.data)
167175
self.assertEqual(list(response.data['actions'].keys()), ['PUT'])
168176

177+
def test_empty_view_does_not_assert(self):
178+
request = factory.get('/1', HTTP_AUTHORIZATION=self.permitted_credentials)
179+
response = empty_list_view(request, pk=1)
180+
self.assertEqual(response.status_code, status.HTTP_200_OK)
181+
169182

170183
class BasicPermModel(models.Model):
171184
text = models.CharField(max_length=100)

0 commit comments

Comments
 (0)