@@ -32,6 +32,13 @@ class NoteViewSet(viewsets.ModelViewSet):
32
32
lookup_field = 'uuid'
33
33
34
34
35
+ class KWargedNoteViewSet (viewsets .ModelViewSet ):
36
+ queryset = RouterTestModel .objects .all ()
37
+ serializer_class = NoteSerializer
38
+ lookup_field = 'text__contains'
39
+ lookup_url_kwarg = 'text'
40
+
41
+
35
42
class MockViewSet (viewsets .ModelViewSet ):
36
43
queryset = None
37
44
serializer_class = None
@@ -40,13 +47,17 @@ class MockViewSet(viewsets.ModelViewSet):
40
47
notes_router = SimpleRouter ()
41
48
notes_router .register (r'notes' , NoteViewSet )
42
49
50
+ kwarged_notes_router = SimpleRouter ()
51
+ kwarged_notes_router .register (r'notes' , KWargedNoteViewSet )
52
+
43
53
namespaced_router = DefaultRouter ()
44
54
namespaced_router .register (r'example' , MockViewSet , base_name = 'example' )
45
55
46
56
urlpatterns = [
47
57
url (r'^non-namespaced/' , include (namespaced_router .urls )),
48
58
url (r'^namespaced/' , include (namespaced_router .urls , namespace = 'example' )),
49
59
url (r'^example/' , include (notes_router .urls )),
60
+ url (r'^example2/' , include (kwarged_notes_router .urls )),
50
61
]
51
62
52
63
@@ -177,6 +188,33 @@ def test_urls_limited_by_lookup_value_regex(self):
177
188
self .assertEqual (expected [idx ], self .urls [idx ].regex .pattern )
178
189
179
190
191
+ class TestLookupUrlKwargs (TestCase ):
192
+ """
193
+ Ensure the router honors lookup_url_kwarg.
194
+
195
+ Setup a deep lookup_field, but map it to a simple URL kwarg.
196
+ """
197
+ urls = 'tests.test_routers'
198
+
199
+ def setUp (self ):
200
+ RouterTestModel .objects .create (uuid = '123' , text = 'foo bar' )
201
+
202
+ def test_custom_lookup_url_kwarg_route (self ):
203
+ detail_route = kwarged_notes_router .urls [- 1 ]
204
+ detail_url_pattern = detail_route .regex .pattern
205
+ self .assertIn ('^notes/(?P<text>' , detail_url_pattern )
206
+
207
+ def test_retrieve_lookup_url_kwarg_detail_view (self ):
208
+ response = self .client .get ('/example2/notes/fo/' )
209
+ self .assertEqual (
210
+ response .data ,
211
+ {
212
+ "url" : "http://testserver/example/notes/123/" ,
213
+ "uuid" : "123" , "text" : "foo bar"
214
+ }
215
+ )
216
+
217
+
180
218
class TestTrailingSlashIncluded (TestCase ):
181
219
def setUp (self ):
182
220
class NoteViewSet (viewsets .ModelViewSet ):
0 commit comments