|
7 | 7 | from django.test import TestCase |
8 | 8 |
|
9 | 9 | from rest_framework_filters import FilterSet, filters |
| 10 | +from django_filters.filters import BaseInFilter |
10 | 11 |
|
11 | 12 | from .testapp.models import ( |
12 | 13 | User, Note, Post, Cover, Page, A, B, C, Person, Tag, BlogPost, |
@@ -156,7 +157,48 @@ def test_relatedfilter(self): |
156 | 157 | note = list(f)[0] |
157 | 158 | self.assertEqual(note.title, "Hello Test 4") |
158 | 159 |
|
159 | | - def test_relatedfilter_combined_with_alllookups(self): |
| 160 | + def test_alllookupsfilter_for_relation(self): |
| 161 | + # See: https://github.com/philipn/django-rest-framework-filters/issues/84 |
| 162 | + class F(FilterSet): |
| 163 | + class Meta: |
| 164 | + model = Note |
| 165 | + fields = { |
| 166 | + 'author': '__all__', |
| 167 | + } |
| 168 | + |
| 169 | + self.assertIsInstance(F.base_filters['author'], filters.ModelChoiceFilter) |
| 170 | + self.assertIsInstance(F.base_filters['author__in'], BaseInFilter) |
| 171 | + |
| 172 | + def test_relatedfilter_combined_with__all__(self): |
| 173 | + # ensure that related filter is compatible with __all__ lookups. |
| 174 | + class F(FilterSet): |
| 175 | + author = filters.RelatedFilter(UserFilter) |
| 176 | + |
| 177 | + class Meta: |
| 178 | + model = Note |
| 179 | + fields = { |
| 180 | + 'author': '__all__', |
| 181 | + } |
| 182 | + |
| 183 | + self.assertIsInstance(F.base_filters['author'], filters.RelatedFilter) |
| 184 | + self.assertIsInstance(F.base_filters['author__in'], BaseInFilter) |
| 185 | + |
| 186 | + def test_filter_persistence_with__all__(self): |
| 187 | + # ensure that __all__ does not overwrite declared filters. |
| 188 | + class F(FilterSet): |
| 189 | + name = filters.ChoiceFilter(lookup_expr='iexact') |
| 190 | + |
| 191 | + class Meta: |
| 192 | + model = Person |
| 193 | + fields = { |
| 194 | + 'name': '__all__', |
| 195 | + } |
| 196 | + |
| 197 | + self.assertIsInstance(F.base_filters['name'], filters.ChoiceFilter) |
| 198 | + |
| 199 | + def test_relatedfilter_for_related_alllookups(self): |
| 200 | + # ensure that filters work for AllLookupsFilter across a RelatedFilter. |
| 201 | + |
160 | 202 | # Test that the default exact filter works |
161 | 203 | GET = { |
162 | 204 | 'author': User.objects.get(username='user2').pk, |
@@ -195,7 +237,7 @@ def test_relatedfilter_combined_with_alllookups(self): |
195 | 237 | f = NoteFilterWithRelatedAll(GET, queryset=Note.objects.all()) |
196 | 238 | self.assertEqual(len(list(f)), 4) |
197 | 239 |
|
198 | | - def test_relatedfilter_combined_with_alllookups_and_different_filter_name(self): |
| 240 | + def test_relatedfilter_for_related_alllookups_and_different_filter_name(self): |
199 | 241 | # Test that the default exact filter works |
200 | 242 | GET = { |
201 | 243 | 'writer': User.objects.get(username='user2').pk, |
@@ -294,7 +336,7 @@ def test_m2m_relation(self): |
294 | 336 | } |
295 | 337 | f = BlogPostFilter(GET, queryset=BlogPost.objects.all()) |
296 | 338 | self.assertEqual(len(list(f)), 2) |
297 | | - titles = set([p.title for p in f]) |
| 339 | + titles = set([person.title for person in f]) |
298 | 340 | self.assertEqual(titles, set(["First post", "Second post"])) |
299 | 341 |
|
300 | 342 | def test_nonexistent_related_field(self): |
|
0 commit comments