Skip to content

Commit 5937ab4

Browse files
author
Ryan P Kilby
committed
Merge pull request #83 from rpkilby/fix-all-lookups-mixin
Fix #82, make all lookups work w/ FilterSet mixins
2 parents 885b3a5 + 8899fd2 commit 5937ab4

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

rest_framework_filters/filterset.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,23 +38,27 @@ def __new__(cls, name, bases, attrs):
3838

3939
new_class = super(FilterSetMetaclass, cls).__new__(cls, name, bases, attrs)
4040
fix_filter_field = _get_fix_filter_field(new_class)
41+
opts = new_class._meta
4142

4243
# order_by is not compatible.
43-
if new_class._meta.order_by:
44-
new_class._meta.order_by = False
44+
if opts.order_by:
45+
opts.order_by = False
4546
warnings.warn(
4647
'order_by is no longer supported. Use '
4748
'rest_framework.filters.OrderingFilter instead. See: '
4849
'https://github.com/philipn/django-rest-framework-filters/issues/72',
4950
DeprecationWarning, stacklevel=2
5051
)
5152

53+
# If no model is defined, skip all lookups processing
54+
if not opts.model:
55+
return new_class
56+
5257
# Populate our FilterSet fields with all the possible
5358
# filters for the AllLookupsFilter field.
5459
for name, filter_ in six.iteritems(new_class.base_filters.copy()):
5560
if isinstance(filter_, filters.AllLookupsFilter):
56-
model = new_class._meta.model
57-
field = filterset.get_model_field(model, filter_.name)
61+
field = filterset.get_model_field(opts.model, filter_.name)
5862

5963
for lookup_expr in utils.lookups_for_field(field):
6064
if isinstance(field, ForeignObjectRel):

tests/test_filterset.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from django.test import TestCase
88

9-
from rest_framework_filters import filters
9+
from rest_framework_filters import FilterSet, filters
1010

1111
from .testapp.models import (
1212
User, Note, Post, Cover, Page, A, B, C, Person, Tag, BlogPost,
@@ -341,6 +341,22 @@ def test_related_filters_caching(self):
341341

342342
self.assertEqual(len(filters), 1)
343343

344+
def test_alllookups_filter_with_mixin(self):
345+
# Mixin FilterSets should not error when no model is provided. See:
346+
# https://github.com/philipn/django-rest-framework-filters/issues/82
347+
class Mixin(FilterSet):
348+
title = filters.AllLookupsFilter()
349+
350+
class Actual(Mixin):
351+
class Meta:
352+
model = Note
353+
354+
GET = {
355+
'title__contains': 'Test',
356+
}
357+
f = Actual(GET, queryset=Note.objects.all())
358+
self.assertEqual(len(list(f)), 4)
359+
344360

345361
class GetFilterNameTests(TestCase):
346362

0 commit comments

Comments
 (0)