44from rest_framework_filters import FilterSet , filters
55
66from .testapp .filters import (
7- CFilter , CoverFilter , NoteFilter , NoteFilterWithAlias , NoteFilterWithRelatedAlias ,
8- PageFilter , PersonFilter , PostFilter , UserFilter ,
7+ AccountFilter , CFilter , CoverFilter , CustomerFilter , NoteFilter , NoteFilterWithAlias ,
8+ NoteFilterWithRelatedAlias , PageFilter , PersonFilter , PostFilter , UserFilter ,
9+ )
10+ from .testapp .models import (
11+ A , Account , B , C , Cover , Customer , Note , Page , Person , Post , Tag , User ,
912)
10- from .testapp .models import A , B , C , Cover , Note , Page , Person , Post , Tag , User
1113
1214
1315class LocalTagFilter (FilterSet ):
@@ -81,54 +83,47 @@ class RelatedFilterTests(TestCase):
8183
8284 @classmethod
8385 def setUpTestData (cls ):
84- #######################
85- # Create users
86- #######################
86+ ########################################################################
87+ # Create users #########################################################
8788 user1 = User .objects .create (username = "user1" , email = "user1@example.org" )
8889 user2 = User .objects .create (username = "user2" , email = "user2@example.org" )
8990
90- #######################
91- # Create notes
92- #######################
91+ ########################################################################
92+ # Create notes #########################################################
9393 note1 = Note .objects .create (title = "Test 1" , content = "Test content 1" , author = user1 )
9494 note2 = Note .objects .create (title = "Test 2" , content = "Test content 2" , author = user1 )
9595 Note .objects .create (title = "Hello Test 3" , content = "Test content 3" , author = user1 )
9696 note4 = Note .objects .create (title = "Hello Test 4" , content = "Test content 4" , author = user2 )
9797
98- #######################
99- # Create posts
100- #######################
98+ ########################################################################
99+ # Create posts #########################################################
101100 post1 = Post .objects .create (note = note1 , content = "Test content in post 1" )
102101 Post .objects .create (note = note2 , content = "Test content in post 2" )
103102 post3 = Post .objects .create (note = note4 , content = "Test content in post 3" )
104103
105- #######################
106- # Create covers
107- #######################
104+ ########################################################################
105+ # Create covers ########################################################
108106 Cover .objects .create (post = post1 , comment = "Cover 1" )
109107 Cover .objects .create (post = post3 , comment = "Cover 2" )
110108
111- #######################
112- # Create pages
113- #######################
109+ ########################################################################
110+ # Create pages #########################################################
114111 Page .objects .create (title = "First page" , content = "First first." )
115112 Page .objects .create (title = "Second page" , content = "Second second." , previous_page_id = 1 )
116113 Page .objects .create (title = "Third page" , content = "Third third." , previous_page_id = 2 )
117114 Page .objects .create (title = "Fourth page" , content = "Fourth fourth." , previous_page_id = 3 )
118115
119- ################################
120- # ManyToMany
121- ################################
116+ ########################################################################
117+ # ManyToMany ###########################################################
122118 t1 = Tag .objects .create (name = "park" )
123119 Tag .objects .create (name = "lake" )
124120 t3 = Tag .objects .create (name = "house" )
125121
126122 post1 .tags .set ([t1 , t3 ])
127123 post3 .tags .set ([t3 ])
128124
129- ################################
130- # Recursive relations
131- ################################
125+ ########################################################################
126+ # Recursive relations ##################################################
132127 a = A .objects .create (title = "A1" )
133128 b = B .objects .create (name = "B1" )
134129 c = C .objects .create (title = "C1" )
@@ -146,6 +141,17 @@ def setUpTestData(cls):
146141 john = Person .objects .create (name = "John" )
147142 Person .objects .create (name = "Mark" , best_friend = john )
148143
144+ ########################################################################
145+ # to_field relations ###################################################
146+ c1 = Customer .objects .create (name = 'Bob Jones' , ssn = '111111111' , dob = '1990-01-01' )
147+ c2 = Customer .objects .create (name = 'Sue Jones' , ssn = '222222222' , dob = '1990-01-01' )
148+
149+ Account .objects .create (customer = c1 , type = 'c' , name = 'Bank 1 checking' )
150+ Account .objects .create (customer = c1 , type = 's' , name = 'Bank 1 savings' )
151+ Account .objects .create (customer = c2 , type = 'c' , name = 'Bank 1 checking 1' )
152+ Account .objects .create (customer = c2 , type = 'c' , name = 'Bank 1 checking 2' )
153+ Account .objects .create (customer = c2 , type = 's' , name = 'Bank 2 savings' )
154+
149155 def test_relatedfilter (self ):
150156 # Test that the default exact filter works
151157 GET = {'author' : User .objects .get (username = 'user2' ).pk }
@@ -399,6 +405,17 @@ def test_empty_param_name(self):
399405 f = NoteFilter (GET , queryset = Note .objects .all ())
400406 self .assertEqual (len (list (f .qs )), 1 )
401407
408+ def test_to_field_forwards_relation (self ):
409+ GET = {'customer__name' : 'Bob Jones' }
410+ f = AccountFilter (GET )
411+ self .assertEqual (len (list (f .qs )), 2 )
412+
413+ def test_to_field_reverse_relation (self ):
414+ # Note: pending #99, this query should ideally return 2 distinct results
415+ GET = {'accounts__type' : 'c' }
416+ f = CustomerFilter (GET )
417+ self .assertEqual (len (list (f .qs )), 3 )
418+
402419
403420class AnnotationTests (TestCase ):
404421 # TODO: these tests should somehow assert that the annotation method is
0 commit comments