我有点坚持以下情况。我想使用 Django Rest Framework 为购物车应用程序构建一个 REST API,但是,由于遗留要求,我需要使用嵌套 URL。
一般来说,我有两个资源 AppUsers 和 Carts。这两种资源都在默认的 /appUsers/ 和 /carts/ 端点上可用。然后,我尝试使用嵌套路由器来获取特定用户的购物车详细信息视图,以便将其寻址为 /appUsers/app_user_pk/cart/ 而不是 /carts/pk/,因为每个 AppUser 无论如何都只能拥有一个购物车。
这是我的设置:
模型.py
class AppUser(models.Model):
_id = models.AutoField(primary_key=True)
class Meta:
default_related_name = 'app_users'
class Cart(models.Model):
app_user = models.OneToOneField(
'AppUser',
on_delete=models.CASCADE,
related_query_name='cart',
)
class Meta:
default_related_name = 'carts'
def __str__(self):
return "{user} cart".format(user=self.app_user._id)
序列化程序.py
class AppUserSerializer(serializers.HyperlinkedModelSerializer):
cart = serializers.HyperlinkedIdentityField(view_name='cart-detail')
class Meta:
model = AppUser
fields = '__all__'
class CartSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Cart
fields = '__all__'
视图.py
class AppUserViewSet(viewsets.ModelViewSet):
"""
Model viewset for AppUser model
"""
queryset = AppUser.objects.all()
serializer_class = AppUserSerializer
class CartViewSet(viewsets.ModelViewSet):
"""
List all carts, or create new / edit existing product.
"""
queryset = Cart.objects.all()
serializer_class = CartSerializer
def get_queryset(self):
if 'app_user_pk' in self.kwargs:
return Cart.objects.filter(app_user=self.kwargs['app_user_pk'])
return Cart.objects.all()
网址.py
router = DefaultRouter()
router.register(r'appUsers', views.AppUserViewSet)
router.register(r'carts', views.CartViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^appUsers/(?P<app_user_pk>[0-9]+)/cart/$', views.CartViewSet.as_view({'get': 'retrieve'}), name='cart-detail'),
]
但是,我无法让它工作,每当我尝试新的东西时,我都会遇到不同的问题。所以我想知道完成这项任务的最佳方法是什么?
本质上,我只想查看 AppUser 可以在 /appUsers/app_user_pk/cart/ 下拥有的一个购物车的购物车详细信息视图
解决方案:
我使用接受的答案来处理上述问题。此外,我还有另一个位于 /appUsers/app_user_pk/cart/products 的 ModelViewSet,然后我使用来自购物车/产品的 drf-nested-router 的 NestedDefaultRouter 进行了注册,如下所示:
cart_products_router = routers.NestedDefaultRouter(router, r'appUsers', lookup='app_user')
cart_products_router.register(r'cart/products', views.CartProductViewSet, base_name='cartproduct')