具有主键前缀的 Django Rest Framework 路由

Django Rest Framework routing with primary key prefix

我正在使用 DRF DefaultRouter 如下。

# urls.py
router = DefaultRouter()
router.register('book', BookingViewSet, basename='booking')
router.register('book/<int:bk>/reservation', ReservationViewSet, basename='reservation')

urlpatterns = [
   path('', include(router.urls)),
]

# view
class ReservationViewSet(viewsets.ModelViewSet):
    serializer_class = ReservationSerializer
    queryset = Reservation.objects.all() # for testing only

但是当我访问 URL /book/1/reservation/ 它说没有找到 url 模式。

lending/ ^book/<int:bk>/reservation/$ [name='reservation-list']
lending/ ^book/<int:bk>/reservation\.(?P<format>[a-z0-9]+)/?$ [name='reservation-list']
lending/ ^book/<int:bk>/reservation/(?P<pk>[^/.]+)/$ [name='reservation-detail']
lending/ ^book/<int:bk>/reservation/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='reservation-detail'] 

The current path, lending/book/1/reservation/, didn’t match any of these. 

我正在使用 bk 来获取图书 ID。

那是因为它将 <int:bk> 实现为正则表达式,所以 没有 任何解释。可能最简单的方法是使用两个路由器:

router1 = DefaultRouter()
router1.register('book', BookingViewSet, basename='booking')

router2 = DefaultRouter()
router2.register('reservation', ReservationViewSet, basename='reservation')

urlpatterns = [
   path('', include(router1.urls)),
   path(<strong>'book/<int:bk>/'</strong>, include(<strong>router2.urls</strong>)),
]

ReservationViewSet 中,您可以使用 bk:

进行过滤
class ReservationViewSet(viewsets.ModelViewSet):
    serializer_class = ReservationSerializer

    def get_queryset(self):
        return Reservation.objects.<strong>filter(book_id=self.kwargs['bk'])</strong>