4
4
from rest_framework_filters import FilterSet , filters
5
5
6
6
from .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 ,
9
12
)
10
- from .testapp .models import A , B , C , Cover , Note , Page , Person , Post , Tag , User
11
13
12
14
13
15
class LocalTagFilter (FilterSet ):
@@ -81,54 +83,47 @@ class RelatedFilterTests(TestCase):
81
83
82
84
@classmethod
83
85
def setUpTestData (cls ):
84
- #######################
85
- # Create users
86
- #######################
86
+ ########################################################################
87
+ # Create users #########################################################
87
88
user1 = User .
objects .
create (
username = "user1" ,
email = "[email protected] " )
88
89
user2 = User .
objects .
create (
username = "user2" ,
email = "[email protected] " )
89
90
90
- #######################
91
- # Create notes
92
- #######################
91
+ ########################################################################
92
+ # Create notes #########################################################
93
93
note1 = Note .objects .create (title = "Test 1" , content = "Test content 1" , author = user1 )
94
94
note2 = Note .objects .create (title = "Test 2" , content = "Test content 2" , author = user1 )
95
95
Note .objects .create (title = "Hello Test 3" , content = "Test content 3" , author = user1 )
96
96
note4 = Note .objects .create (title = "Hello Test 4" , content = "Test content 4" , author = user2 )
97
97
98
- #######################
99
- # Create posts
100
- #######################
98
+ ########################################################################
99
+ # Create posts #########################################################
101
100
post1 = Post .objects .create (note = note1 , content = "Test content in post 1" )
102
101
Post .objects .create (note = note2 , content = "Test content in post 2" )
103
102
post3 = Post .objects .create (note = note4 , content = "Test content in post 3" )
104
103
105
- #######################
106
- # Create covers
107
- #######################
104
+ ########################################################################
105
+ # Create covers ########################################################
108
106
Cover .objects .create (post = post1 , comment = "Cover 1" )
109
107
Cover .objects .create (post = post3 , comment = "Cover 2" )
110
108
111
- #######################
112
- # Create pages
113
- #######################
109
+ ########################################################################
110
+ # Create pages #########################################################
114
111
Page .objects .create (title = "First page" , content = "First first." )
115
112
Page .objects .create (title = "Second page" , content = "Second second." , previous_page_id = 1 )
116
113
Page .objects .create (title = "Third page" , content = "Third third." , previous_page_id = 2 )
117
114
Page .objects .create (title = "Fourth page" , content = "Fourth fourth." , previous_page_id = 3 )
118
115
119
- ################################
120
- # ManyToMany
121
- ################################
116
+ ########################################################################
117
+ # ManyToMany ###########################################################
122
118
t1 = Tag .objects .create (name = "park" )
123
119
Tag .objects .create (name = "lake" )
124
120
t3 = Tag .objects .create (name = "house" )
125
121
126
122
post1 .tags .set ([t1 , t3 ])
127
123
post3 .tags .set ([t3 ])
128
124
129
- ################################
130
- # Recursive relations
131
- ################################
125
+ ########################################################################
126
+ # Recursive relations ##################################################
132
127
a = A .objects .create (title = "A1" )
133
128
b = B .objects .create (name = "B1" )
134
129
c = C .objects .create (title = "C1" )
@@ -146,6 +141,17 @@ def setUpTestData(cls):
146
141
john = Person .objects .create (name = "John" )
147
142
Person .objects .create (name = "Mark" , best_friend = john )
148
143
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
+
149
155
def test_relatedfilter (self ):
150
156
# Test that the default exact filter works
151
157
GET = {'author' : User .objects .get (username = 'user2' ).pk }
@@ -399,6 +405,17 @@ def test_empty_param_name(self):
399
405
f = NoteFilter (GET , queryset = Note .objects .all ())
400
406
self .assertEqual (len (list (f .qs )), 1 )
401
407
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
+
402
419
403
420
class AnnotationTests (TestCase ):
404
421
# TODO: these tests should somehow assert that the annotation method is
0 commit comments