具有主键前缀的 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>
我正在使用 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>